3

だから、ここに私の状況があります:

  • ユーザーにファイルを保存するフォルダーを選択するように求めるアプリケーションがあります
  • ここで、彼のファイルが次のようになっているとしましょう: a.png, b.png,c.png

私が欲しいのは:

  • ファイルa.pngが選択したフォルダーに既に存在する場合、上書きしないでください。代わりに、 name のファイルを作成しますa (1).png。ファイルa (1).pngが既に存在する場合は、 のようa (2).pngに名前を付けます。これは、OS X が同じ名前のファイルをコピーして貼り付ける場合とほとんど同じです。

これは私が現在行っている方法ですが、それでもうまくいきません:

NSString* target = [self getTargetPathForFile:filename path:folder];

NSString* fname = [target lastPathComponent];

while ([[NSFileManager defaultManager] fileExistsAtPath: [folder stringByAppendingPathComponent:fname]])
{
    //NSLog(@"FNAME : %@",fname);

    if ([self str:fname containsString:@")." options:nil])
    {
        NSArray* a = [fname componentsSeparatedByString:@"("];
        NSArray* b = [[a objectAtIndex:1] componentsSeparatedByString:@")"];

        fname = [NSString stringWithFormat:@"%@(%d)%@",[a objectAtIndex:0],[[b objectAtIndex:0] intValue]+1,[b objectAtIndex:1]];
    }
    else
    {
        fname = [NSString stringWithFormat:@"%@ (1).%@",[fname stringByDeletingPathExtension],[fname pathExtension]];
    }

    //NSLog(@"Setting filename to :: %@",fname);
}
target = [folder stringByAppendingPathComponent:fname];

これについてどうすればいいですか?これには、Cocoa に適した (または組み込みの) メソッドはありますか?

4

2 に答える 2

8

これを試してみませんか:

NSString* fname = [target lastPathComponent];
NSString* fnameNoExt = [fname stringByDeletingPathExtension];
NSString* extension = [fname pathExtension];

int fileIndex = 1;
while ([[NSFileManager defaultManager] fileExistsAtPath: [folder stringByAppendingPathComponent:fname]])
{
    //NSLog(@"FNAME : %@",fname);
    fname = [NSString stringWithFormat:@"%@ (%d).%@", fnameNoExt, fileIndex, extension];
    //NSLog(@"Setting filename to :: %@",fname);
    fileIndex++;
}
target = [folder stringByAppendingPathComponent:fname];
于 2012-10-16T11:07:16.577 に答える
1

コメントで説明したようにファイル名をあまり気にせず、代わりに自動生成されたファイル名を使用することを検討できる場合はCFUUID、 、NSProcessInfo、またはmkstemp.

  • を使用CFUUIDして一意の識別子を生成するstr:

    CFUUIDRef uuidref = CFUUIDCreate(NULL);
    CFStringRef cfstr = CFUUIDCreateString(NULL, uuidref);
    // If using ARC:
    NSString* filename = (__bridge_transfer NSString*)cfstr;
    // If not using ARC
    NSString* filename = [(NSString*)cfstr autorelease];
    // Then release the CFUUIDRef
    CFRelease(uuidref);
    
  • 使用するNSProcessInfo

    NSString* filename = [[NSProcessInfo processInfo] globallyUniqueString];
    
  • 使用法mkstemp: CocoaWithLoveを参照

于 2012-10-16T11:56:36.547 に答える