archiver un dossier, NSArchiver NSFileManager |
Bienvenue invité ( Connexion | Inscription )
archiver un dossier, NSArchiver NSFileManager |
29 May 2004, 12:04
Message
#1
|
|
Adepte de Macbidouille Groupe : Membres Messages : 112 Inscrit : 22 Dec 2003 Membre no 12 727 |
Bonjour,
Comment faire pour transformer un dossier (directory) en fichier ? Je voudrais passer par une solution purement Cocoa et pas par une commande tar. Il n'existe pas de classe NSDirectory donc on ne peut pas représenter un dossier pour le transformer en NSData. Il doit bien y avoir une façon simple de faire ça mais je ne trouve pas. Merci. Romain. |
|
|
29 May 2004, 17:06
Message
#2
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 291 Inscrit : 29 May 2004 Lieu : 48°50'27" N, 2°13'43" E Membre no 19 336 |
Salut,
Je ne pense pas que ce soit faisable directement en cocoa, en tout cas pas facilement. Je plus simple serait d'utiliser la commande ZIP à partir de cocoa: 1. on créer un NSArray avec les bons paramètres 2. on crée et lance un NSTask CODE - (void) zipDirectory: (NSString*) dirPath toFile: (NSString*) zipFilePath { OSErr result; NSTask *task; NSArray *args; // prépration paramètres args = [NSArray arrayWithObjects: @"-r", zipFilePath, dirPath, nil]; // lancement task = [NSTask launchedTaskWithLaunchPath: @"/usr/bin/zip" arguments: args]; // attente fin [task waitUntilExit]; // résultat result = [task terminationStatus]; NSLog (@"resultat du zip: %d", result]; } Si on veut que la compression ait lieu en parallèle de l'exécution de l'application cocoa, supprimer [task waitUntilExit] et ce qui suit. Mais on ne sera pas informé de la fin de la tâche. Donc: CODE - (void) zipDirectory: (NSString*) dirPath toFile: (NSString*) zipFilePath { NSTask *task; NSArray *args; // paramètres de la commande zip args = [NSArray arrayWithObjects: @"-r", zipFilePath, dirPath, nil]; // préparation de la tâche task = [[NSTask alloc] init]; [task setLaunchPath: @"/usr/bin/zip"]; [task setArguments: args]; // notification pour fin de tâche [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (zipDone:) name: NSTaskDidTerminateNotification object: task]; // lancement [task launch]; } - (void) zipDone: (NSNotification*) notification { OSErr result; NSTask *task; task = [notification object]; result = [task terminationStatus]; [task release]; NSLog (@"resultat du zip: %d", result]; } Quand la tâche est terminée, zipDone est appelé et affiche le code retour de la commande. Si on veut interrompre la compression avant la fin, appeler [task terminate]. Bonne chance... Christian Ce message a été modifié par cbrandt - 29 May 2004, 17:18. -------------------- Membre no. 14 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
|
|
|
29 May 2004, 18:54
Message
#3
|
|
Adepte de Macbidouille Groupe : Membres Messages : 112 Inscrit : 22 Dec 2003 Membre no 12 727 |
Merci beaucoup.
Donc en cocoa pur, c'est pas possible. Pour ziper ta méthode marche impec. Maintenant, encore une question: j'essaie de dézipper à partir d'un NSData parce que les données que j' obtiens proviennent d' une NSURLConnection. J' ai donc essayé la même méthode avec comme éxécutable unzip. Par contre je n' ai pas l'impression que l'on peut utiliser unzip pour dézipper un flux de données. J'ai essayé de changer le standartInput de la NSTask, mais j'ai des erreurs. voilà ce que j'ai fait: CODE NSPipe * enbois = [NSPipe pipe]; NSFileHandle * file = [enbois fileHandleForWriting]; [file writeData:data]; [task setStandardInput: file ]; Ca bloque tout. On dirait que la tache ne se termine pas. Est ce que le problème vient du code ou de la commande unix qui n'accèpte pas les pipe ? |
|
|
29 May 2004, 18:59
Message
#4
|
|
Moderating Daemon Groupe : Modérateurs Messages : 6 345 Inscrit : 22 Feb 2004 Lieu : Yvelines/Cambridge (GB), dans mon pantalon Membre no 15 207 |
QUOTE (romainB @ 29 May 2004, 19:54) Merci beaucoup. Donc en cocoa pur, c'est pas possible. Pour ziper ta méthode marche impec. Maintenant, encore une question: j'essaie de dézipper à partir d'un NSData parce que les données que j' obtiens proviennent d' une NSURLConnection. J' ai donc essayé la même méthode avec comme éxécutable unzip. Par contre je n' ai pas l'impression que l'on peut utiliser unzip pour dézipper un flux de données. J'ai essayé de changer le standartInput de la NSTask, mais j'ai des erreurs. voilà ce que j'ai fait: CODE NSPipe * enbois = [NSPipe pipe]; NSFileHandle * file = [enbois fileHandleForWriting]; [file writeData:data]; [task setStandardInput: file ]; Ca bloque tout. On dirait que la tache ne se termine pas. Est ce que le problème vient du code ou de la commande unix qui n'accèpte pas les pipe ? Si tu regardes la man page de zip, on peut effectivement voir que ca ne marche pas. Par contre avec gunzip tu peux. Tu peux aussi faire tout ceci en utilisant directement la zlib. -------------------- G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A MacBook core duo 1.83 GHz |
|
|
29 May 2004, 20:07
Message
#5
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 291 Inscrit : 29 May 2004 Lieu : 48°50'27" N, 2°13'43" E Membre no 19 336 |
Je n'ai jamais essayé avec les pipes, mais sur la ligne de commande 'unzip toto.zip' c'est ok.
Donc tu pourrais mettre ton NSData dans un fichier temporaire: CODE NSData * monNSData; NSArray *args; NSTask *task; ... [monNSData writeToFile: @"/tmp/toto.zip" atomically: YES]; args = [NSArray arrayWithObject: @"/tmp/toto.zip"]; task = [NSTask launchedTaskWithLaunchPath: @"/usr/bin/unzip" arguments: args]; Evidemment, utiliser la zlib comme le suggère f_cam, c'est mieux... je ne la connaissais pas, celle-la. Je le note... [EDIT] il faudrait ajouter le paramètre -d à unzip et spécifier le répertoire de destination: CODE args = [NSArray arrayWithObjects: @"/tmp/toto.zip", @"-d", cheminRepDestination, nil]; [/EDIT] Ce message a été modifié par cbrandt - 29 May 2004, 20:17. -------------------- Membre no. 14 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
|
|
|
Nous sommes le : 24th April 2024 - 04:48 |