36 votes

NSFileHandle fileHandleForWritingAtPath: return null!

mon application iPad dispose d'une petite fonction de téléchargement, pour laquelle je souhaite ajouter les données à l'aide d'un NSFileHandle. Le problème est que l'appel de création ne renvoie que des descripteurs de fichiers nuls. Quel pourrait être le problème? Voici les trois lignes de code qui sont censées créer mon descripteur de fichier:

 NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName]; 
NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
 

J'ai vérifié le chemin du fichier et je n'ai rien vu de mal.

TYIA

86voto

Raphael Schweikert Points 6380

fileHandleForWritingAtPath n'est pas une "création" appel. La documentation indique explicitement: "Valeur de Retour: Le initialisé descripteur de fichier, ou nil si aucun fichier n'existe pas, au chemin d'accès" (italiques ajoutés). Si vous souhaitez créer le fichier s'il n'existe pas, vous devez utiliser quelque chose comme ceci:

 NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
 if(output == nil) {
      [[NSFileManager defaultManager] createFileAtPath:self.finalPath contents:nil attributes:nil];
      output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
 }

Si vous souhaitez ajouter le fichier s'il existe déjà, utilisez quelque chose comme [output seekToEndOfFile]. Votre code complet se présente ensuite comme suit:

 NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
 self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName]; 
 NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
 if(output == nil) {
      [[NSFileManager defaultManager] createFileAtPath:self.finalPath contents:nil attributes:nil];
      output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
 } else {
      [output seekToEndOfFile];
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X