2016-05-24 13 views
1

現在、次のコードを使用してNSDataをドキュメントフォルダのサブフォルダに書き込みます。NSData:writeToFileがエラー「ファイルが存在しません」を返します。

NSData* dataToSave=...; 
NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSString* documentsDir=[ 
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
    objectAtIndex:0]; 
NSString* desiredFolder=[documentsDir stringByAppendingPathComponent:@"MySubfolder"]; 
BOOL isDir; 

if (![fileManager fileExistsAtPath:desiredFolder isDirectory:&isDir]&&!isDir) 
{ 
    NSError* error; 
    [fileManager createDirectoryAtPath:desiredFolder 
     withIntermediateDirectories:NO attributes:nil error:&error]; 
    if (error) { 
     NSLog(@"Error%@", error.localizedDescription); 
    } 
}  
NSString* desiredFile=[desiredFolder stringByAppendingPathComponent:@"mfile.jpeg"]; 
if (![dataToSave writeToFile:desiredFile options:NSDataWritingAtomic error:&error]) 
{ 
    NSLog(@"Error %@",error.localizedDescription); 
    return NO; 
} 

「リリースモード」でこの設定をテストするまでは機能していました。 NSData:writeToFileがNOを返し始めました。エラーはThe file 'myfile.jpeg´ doesn't existです。

問題はどこですか?

おかげで、私は答えを見つけた@mbiへ

+2

あなたは '' /mfile.jpeg "' not myfile.jpegですか? –

+0

また、appendString文字列の場合は '@"/"'を使用する必要がありますが、 'stringByAppendingPathComponent'を使用しています。スワッシュではなく、fileNameを渡してください。 –

+0

これは転写エラーでした。 '/'のないバージョンを使用しています。 – Addev

答えて

1

感謝。

if (![fileManager fileExistsAtPath:desiredFolder isDirectory:&isDir]&&!isDir) 

これは正しくありません。親フォルダの存在を検証するときに

問題があります。 isDirectory paramが安全でないため、メソッドの結果がNOであっても、isDirは真である可能性があります。

if (![fileManager fileExistsAtPath:desiredFolder isDirectory:nil]) 

またはファイルがなく、存在しているケースを処理したい場合はディレクトリではありません:だから、評価するための正しい方法はただで

if (![fileManager fileExistsAtPath:desiredFolder isDirectory:&isDir]){ 
... 
}else if(!isDir) { 
... 
} 
+0

私はこれが正しいと思うメソッドが 'NO'を返すとき' isDir'は 'YES'になることができます。 'isDir'を' NO'に初期化すると仮定すると意味がありません。存在しないファイルはディレクトリでもありません。 – trojanfoe

0

は、この方法を試してみてください。

if (![dataToSave writeToFile:desiredFile atomically:YES]) 
{ 
    NSLog(@"Error writing to file : %@",desiredFile); 
    return NO; 
} 
関連する問題