1

ファイルをコピーするときにiOSアプリでOSXの動作を使用したいのですが、存在する場合は、それにカウンターを追加します。

  • myFile.png => myFile 1.png
  • myFile20.png => myFile20 1.png
  • myFile 20.png => myFile 21.png
  • ..。

これを行うための組み込みの方法はありますか、それともその機能を自分で構築する必要がありますか?私はそのようなものを見つけることができませんでしたが、私はこの行動を必要とする最初の人ではないと思います...

4

5 に答える 5

2

次のようなことができます。ここで、requestedNameはユーザーが選択したファイル名、はextensionファイルの拡張子、はファイルをbasePath保存しようとしているフォルダーです。

 NSFileManager *fm = [NSFileManager defaultManager];
 NSString * filename = requestedName;

 if ([fm fileExistsAtPath:[basePath stringByAppendingPathComponent:requestedName]]) 
{   
     unsigned int counter = 1;
     while ( [fm fileExistsAtPath: [basePath stringByAppendingPathComponent: filename]]) 
     {
         //NSLog(@"File already exists %@", filename);
         NSURL *originalFilePath = [NSURL URLWithString:[kTempPath stringByAppendingPathComponent:filename]];
         filename = [[NSString stringWithFormat: @"%@-%d",
         [requestedName stringByDeletingPathExtension], counter]stringByAppendingPathExtension: extension];
         counter ++;
         NSURL *newFilePath = [NSURL URLWithString:[kTempPath stringByAppendingPathComponent:filename]];
         [fm moveItemAtURL:originalFilePath toURL:newFilePath error:nil]; 
      // just in case
         if (counter > 512) break;
     }
}

ファイルが存在しない場合は、NSFileManagerを使用してmoveItemAtURL、またはmoveItemAtPathNSFileManagerからファイルを正しい場所に移動します。

于 2013-02-27T09:08:57.027 に答える
1

ソースファイル名を変更するだけで、その名前をソースパスの最後のコンポーネントとして使用できます。ちょうどこのような:

-(XMPFile*) duplicateDocument:(XMPFile*)file error:(NSError **)error
{
    NSString *filePath = [file path];
    NSString *destinationPath = [[file path] stringByDeletingLastPathComponent];
    NSString *pathExtension = [filePath pathExtension];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *fileName = [[[file path] lastPathComponent] stringByDeletingPathExtension];

    unsigned int counter = 2;

    while ([fileManager fileExistsAtPath:filePath])
    {
        NSString *duplicatedFilePathLastComponent = [[NSString stringWithFormat: @"%@ %d", fileName, counter] stringByAppendingPathExtension: pathExtension];

        NSString *duplicatedFilePath = [destinationPath stringByAppendingPathComponent:duplicatedFilePathLastComponent];

        if (![fileManager fileExistsAtPath:destinationPath]) {
            if ([fileManager copyItemAtPath:filePath toPath:duplicatedFilePath error:error]) {
                XMPFile *duplicatedXMPFile = [[XMPFile alloc] initWithPath:duplicatedFilePath];
                return duplicatedXMPFile;
            }
        }

        counter ++;
    }
    return nil;
}

必要に応じて、エラーメッセージを追加することもできます

于 2014-10-17T01:36:26.443 に答える
0

NSFileManagerには組み込みのメカニズムはないと思います。ほとんどの場合、エラータイプを調べて、独自に実装する必要があります。エラーの種類が「すでに存在する」場合は、適切なカウンタを追加してコピーしてみてください。

于 2013-02-27T08:53:44.690 に答える
0

iOSではサポートされていません。

ランダムカウンター(おそらくタイムティック)を生成し、それをファイル名に追加する必要があります。

于 2013-02-27T08:53:53.337 に答える
0

ここにはすでにいくつかの答えがあることを私は理解していますが、私は提供されたものよりも少し簡単だと感じました。

私もこの問題を解決する必要がありました。ユニットテストを簡単に行えるように、関数を定義しました。

- (NSString*)findNextValidFilePathAt:(NSString*)destination
                        withFileName:(NSString*)fileName
{
    NSFileManager* filemgr = [NSFileManager defaultManager];
    NSString* newFilePath = [destination stringByAppendingPathComponent:fileName];
    NSString* originalFilePathWithoutExtension = [newFilePath stringByDeletingPathExtension];
    NSString* pathExtension = [fileName pathExtension];
    int numberToAppend = 0;

    while ([filemgr fileExistsAtPath:newFilePath] && numberToAppend <= 99)
    {
        // find a new file path to try: <original_path> <number>.<extension>
        // Ex: /users/alex/desktop/image 1.png
        numberToAppend++;
        newFilePath = [NSString stringWithFormat:@"%@ %d.%@",
                       originalFilePathWithoutExtension,
                       numberToAppend,
                       pathExtension];
    }

    return newFilePath;
}
于 2017-05-19T17:49:26.677 に答える