0

ファイルの振る舞いを伴う奇妙な振る舞い。これが問題です。私は携帯電話のカメラを使用して写真を撮り、内部でサムネイルを生成しています。それらを一時ファイルとしてDocumentsディレクトリに保存しています。

完全なコードは次のとおりです。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

UIImage *photo = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
photo = [self scaleAndRotateImage:photo];

// save photo
NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSLog(@"Writing to %@",docsDir);

// save photo file
NSLog(@"Saving photo as %@",[NSString stringWithFormat:@"%@/temp_photo.png",docsDir]);
[UIImagePNGRepresentation(photo) writeToFile:[NSString stringWithFormat:@"%@/temp_photo.png",docsDir] atomically:YES];

// make and save thumbnail
NSLog(@"Saving thumbnail as %@",[NSString stringWithFormat:@"%@/temp_thumb.png",docsDir]);
UIImage *thumb = [self makeThumbnail:photo];
[UIImagePNGRepresentation(thumb) writeToFile:[NSString stringWithFormat:@"%@/temp_thumb.png",docsDir] atomically:YES];

NSFileManager *manager = [NSFileManager defaultManager];    
NSError *error;
NSArray *files = [manager contentsOfDirectoryAtPath:docsDir error:&error];
NSLog(@"\n\nThere are %d files in the documents directory %@",(files.count),docsDir);

for (int i = 0; i < files.count; i++) {
    NSString *filename = [files objectAtIndex:i];
    NSLog(@"Seeing filename %@",filename);
}

// done
//[photo release];
//[thumb release];
[self dismissModalViewControllerAnimated:NO];
[delegate textInputFinished];
}

ご覧のとおり、問題(これから発生します)を理解するために、ここにかなりのログインを入れました。この時点までのログ出力は次のとおりです。

Writing to /var/mobile/Applications/77D792DC-A224-4A47-8A4C-BB7C557626F3/Documents

Saving photo as /var/mobile/Applications/77D792DC-A224-4A47-8A4C-BB7C557626F3/Documents/temp_photo.png

Saving thumbnail as /var/mobile/Applications/77D792DC-A224-4A47-8A4C-BB7C557626F3/Documents/temp_thumb.png

There are 3 files in the documents directory /var/mobile/Applications/77D792DC-A224-4A47-8A4C-BB7C557626F3/Documents

Seeing filename temp_photo.png

Seeing filename temp_text.txt

Seeing filename temp_thumb.png

これは絶対に予想通りです。私は明らかにデバイス上に3つのファイルを持っています。動作する次のコードは次のとおりです-textInputFinishedメッセージを受信したコード:

- (void)textInputFinished {

NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSError *error;

// get next filename
NSString *filename;
int i = 0;
do {
    i++;
    filename = [NSString stringWithFormat:@"%@/reminder_%d",docsDir,i];
    NSLog(@"Trying filename %@",filename);
} while ([fileManager fileExistsAtPath:[filename stringByAppendingString:@".txt"]]);

NSLog(@"New base filename is %@",filename);

NSArray *files = [fileManager contentsOfDirectoryAtPath:docsDir error:&error];
NSLog(@"There are %d files in the directory %@",(files.count),docsDir);

これは、新しい、一時的ではない、使用されていないファイル名を取得するためのテストです。それはそれを行います-しかし、それはドキュメントフォルダにファイルがないことを示しています!ログに記録された出力は次のとおりです。

Trying filename /var/mobile/Applications/77D792DC-A224-4A47-8A4C-BB7C557626F3/Documents/reminder_1

New base filename is /var/mobile/Applications/77D792DC-A224-4A47-8A4C-BB7C557626F3/Documents/reminder_1

There are 0 files in the directory /var/mobile/Applications/77D792DC-A224-4A47-8A4C-BB7C557626F3/Documents

一体何?3つのファイルはどこに行きましたか?

4

2 に答える 2

1

これは奇妙な答えのように思えるかもしれませんが、最近 UIImagePickerController で奇妙な画像の可用性の問題が発生したので、これを試してください: ピッカーのデリゲート呼び出しの直後に、それを閉じて解放します:

- (void)imagePickerController:(UIImagePickerController *)picker 
                      didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:NO];
    [picker release];

次に、残りのコードに進みます。理由は不明ですが、 の内容はinfo実際にはリリース後まで利用できません。

これがあなたの解決策であることが判明したとしても、ファイルが存在しているように見えて消えてしまう理由はまだわかりません。それでも、一見の価値があります。

于 2010-12-29T20:15:35.877 に答える
1

このようにドキュメントディレクトリを取得すると、違いが生じるのではないかと思います:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
于 2010-12-29T23:47:40.667 に答える