writeToFile 2 fois

elfelf Membre
13:19 modifié dans Vos applications #1
'soir

Je renconrtre un gros problème ici:

Les docs de mon applications sont des packets.
Je crée des NSFileWrapper et je les écrits au path passé en argument à  la méthode, ensuite je dois gérer par une NSTask la création d'une image disque à  l'intérieur de ce packet... pour cela j'utilise le code suivant:

-(BOOL)writeToFile:(NSString *)s ofType:(NSString *)type<br />{<br />	NSFileWrapper *versionTxt = [[NSFileWrapper alloc] initRegularFileWithContents:[@&quot;1.0&quot; dataUsingEncoding:NSUTF8StringEncoding]];<br />	NSFileWrapper *accesFile = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:versionTxt, nil] forKeys:[NSArray arrayWithObjects:@&quot;versionTxt&quot;, nil]]];<br />	[accesFile writeToFile:s atomically:YES updateFilenames:YES];<br />	if(!path){<br />		path = [s retain];<br />	}<br />	if(!saved){<br />		NSLog(path);<br />		NSLog(@&quot;va lancer l&#39;alert&quot;);<br />		NSRunAlertPanel(@&quot;Crypatage basé sur fichier&quot;,@&quot;Vous deverez entrer à  présent un dossier sur lequel faire le cryptage, tout les documents serons crypté dans le volume crée par Acces-, mais vous pouvez entrer cancel ce qui créras un volume vide que vous pourrez par la suite éditer et vous pourrez y rajouter des fichier, vous pouvez aussi changer la taille des volumes de préférence pour les volumes vides, mais sachez que les volumes gradissent automatiquement en fonction des fichier que vous y encryptez.&quot;,@&quot;&quot;,nil,nil);<br />		NSLog(@&quot;fini l&#39;alert&quot;);<br />		int result;<br />		NSArray *fileTypes = [NSArray arrayWithObjects:@&quot;acces&quot;,nil];<br />		NSOpenPanel *oPanel = [NSOpenPanel openPanel];<br />		[oPanel setAllowsMultipleSelection:NO];<br />		[oPanel setCanChooseFiles:NO];<br />		[oPanel setCanChooseDirectories:YES];<br />		NSLog(@&quot;va lancer OP&quot;);<br />		result = [oPanel runModalForDirectory:NSHomeDirectory()<br />										 file:nil types:fileTypes];<br />		NSLog(@&quot;fini l&#39;OP: result=%i&quot;, result);<br />		if (result == NSOKButton) {<br />			NSLog(@&quot;writeToFile after 2nd OP&quot;);<br />			[self createDmgWithSrcPath:[[oPanel filenames] objectAtIndex:0]];<br />			NSLog([[oPanel filenames] objectAtIndex:0]);<br />			saved = YES;<br />		}else{<br />			[self createDmgWithSrcPath:nil andDestination:s];<br />		}<br />	}else{<br />		NSBeep();<br />	}<br />	return YES;<br />}<br />


et voilà : createDmgWithSrcPath: andDestination:

-(void)createDmgWithSrcPath:(NSString *)srcPath andDestination:(NSString *)destination <br />{<br />	NSTask *createTask = [[NSTask alloc] init];<br />	[createTask setLaunchPath:@&quot;/usr/bin/hdiutil&quot;];<br />	/*if(path){<br />		[createTask setArguments:[NSArray arrayWithObjects:@&quot;create&quot;, @&quot;-type&quot;, @&quot;SPARSE&quot;, @&quot;-size&quot;, @&quot;1g&quot;, @&quot;-fs&quot;, @&quot;HFS+&quot;, @&quot;-encryption&quot;, @&quot;CEncryptedEncoding&quot;, @&quot;-passphrase&quot;, @&quot;test333&quot;, @&quot;-srcfolder&quot;, srcPath, @&quot;-volname&quot;, @&quot;SuperCool&quot;, [path stringByAppendingPathComponent:@&quot;Main&quot;], nil]];<br />	}else{*/<br />		[createTask setArguments:[NSArray arrayWithObjects:@&quot;create&quot;, @&quot;-type&quot;, @&quot;SPARSE&quot;, @&quot;-size&quot;, @&quot;1g&quot;, @&quot;-fs&quot;, @&quot;HFS+&quot;, @&quot;-encryption&quot;, @&quot;CEncryptedEncoding&quot;, @&quot;-passphrase&quot;, @&quot;test333&quot;, @&quot;-volname&quot;, @&quot;SuperCool&quot;, [destination stringByAppendingPathComponent:@&quot;Main&quot;], nil]];<br />	//}<br />	[createTask launch];<br />}<br />


(j'ai commenté le test et la première possibilité car elle posais problème mais c'est en fait le but de l'open panel dans le code de sauvegarde

J'ai pas encore implémenté le system pour insérer le mot de passe, là  il y a encore le mdp test333)

Mais grace à  mes log j'ai vu que apple nous fesais enregistrer dans un dossier temporaire et que dés que nous avont écrit le moindre fichier il le déplace dans l'endrois choisi pas le dialog, n'y a t'il pas moyen de contrer ce problème?

Réponses

  • BruBru Membre
    13:19 modifié #2
    Mets le paramètre atomically à  NO dans la méthode writeToFile de NSFileWrapper.

    En mettant YES, le système créé un fichier temporaire avant d'écraser l'original par ce fichier. Ceci garantie que si ton appli plante pendant l'écriture, le fichier original ne sera pas endommagé.

    .
  • elfelf Membre
    13:19 modifié #3
    ça marche toujours pas...

    voilà  mon log:

    [Session started at 2005-11-02 19:10:33 +0200.]<br />2005-11-02 19:15:35.269 Acess?à„à¬[2297] /Volumes/Fichiers/.TemporaryItems/folders.503/TemporaryItems/com.apple.acces_2297_152644535_1/Untitled.acces<br />2005-11-02 19:15:35.269 Acess?à„à¬[2297] va lancer l&#39;alert<br />2005-11-02 19:15:36.425 Acess?à„à¬[2297] fini l&#39;alert<br />2005-11-02 19:15:36.496 Acess?à„à¬[2297] va lancer OP<br />2005-11-02 19:15:40.526 Acess?à„à¬[2297] fini l&#39;OP: result=0<br />hdiutil: WARNING: -passphrase has been deprecated in favor of -stdinpass<br />hdiutil: create failed - Fichier ou répertoire inexistant<br /><br />Acess? has exited with status 0.<br />
    


    Le premièr élément de mon log est le chemin du fichier à  écrire, autrement dit un fichier temporaire qui n'existe plus quand ma task essaye de le modifier...

    Donc je voudrais savoir si c'est possible (une méthode interne de NSDocument peut être) de trouver le chemin actuel du fichier?
  • elfelf Membre
    novembre 2005 modifié #4
    Ah, j'ai découvert [self fileName] mais le problème est que maintenant hdiutil me met une autre erreur, le chemin manquant, normal vu que [self fileName] est nil, vous savez pourquoi?

    EDIT: Même chose avec [[self fileURL] absolutString]
  • elfelf Membre
    13:19 modifié #5
    Salut,

    personne n'as d'idee?
  • BruBru Membre
    13:19 modifié #6
    Comment veux-tu qu'on t'aide ?

    Déjà , c'est quoi self ? Une classe à  toi ? Et si oui, comment peut on comprendre ce qui se passe sans même voir le bout de code qui implémente la méthode  filename...

    .
  • elfelf Membre
    13:19 modifié #7
    J'ai expliqué dans mon premier post: une instance de MyDocument (sous-classe de NSDocument)
  • BruBru Membre
    novembre 2005 modifié #8
    dans 1131127531:

    J'ai expliqué dans mon premier post: une instance de MyDocument (sous-classe de NSDocument)


    Excuse, mais ce n'est vraiment pas évident en lisant ton premier post :

    dans 1130885785:

    'soir
    Je renconrtre un gros problème ici:
    Les docs de mon applications sont des packets.
    Je crée des NSFileWrapper et je les écrits au path passé en argument à  la méthode, ensuite je dois gérer par une NSTask la création d'une image disque à  l'intérieur de ce packet... pour cela j'utilise le code suivant:
    [...]
    et voilà : createDmgWithSrcPath: andDestination:
    [...]
    (j'ai commenté le test et la première possibilité car elle posais problème mais c'est en fait le but de l'open panel dans le code de sauvegarde
    J'ai pas encore implémenté le system pour insérer le mot de passe, là  il y a encore le mdp test333)
    Mais grace à  mes log j'ai vu que apple nous fesais enregistrer dans un dossier temporaire et que dés que nous avont écrit le moindre fichier il le déplace dans l'endrois choisi pas le dialog, n'y a t'il pas moyen de contrer ce problème?


    .
  • elfelf Membre
    13:19 modifié #9
    Les docs de mon applications sont des packets.


    Sinon pas d'idée?
  • elfelf Membre
    13:19 modifié #10
    Il n'y aurrais pas quelqu'un qui aurrais une idée formidable, car la ça me coince plus que pas mal...
  • elfelf Membre
    13:19 modifié #11
    Je remonte un petit peu, j'ai toujour ce problème...
Connectez-vous ou Inscrivez-vous pour répondre.