IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> archiver un dossier, NSArchiver NSFileManager
Options
romainB
posté 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.
Go to the top of the page
 
+Quote Post
cbrandt
posté 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
Go to the top of the page
 
+Quote Post
romainB
posté 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 ?
Go to the top of the page
 
+Quote Post
f_cam
posté 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
Go to the top of the page
 
+Quote Post
cbrandt
posté 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... smile.gif

[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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 23rd April 2024 - 11:51