NSFileManager:重复文件(如果存在)

时间:2013-02-27 08:46:43

标签: ios nsfilemanager

我想在复制文件时在iOS-App中使用OSX行为:如果存在,请附加一个计数器:

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

是否有内置方法可以执行此操作,还是我必须自己构建该功能?我找不到那样的东西,但我不认为我是第一个需要这种行为的人......

5 个答案:

答案 0 :(得分: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中的moveItemAtURLmoveItemAtPath将其移动到正确的位置。

答案 1 :(得分: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;
}

如果需要,还可以添加错误消息

答案 2 :(得分:0)

我认为NSFileManager中没有任何内置机制。很可能你需要通过检查错误类型来实现自己的。如果错误是“已经存在”,那么尝试附加适当的计数器并复制。

答案 3 :(得分:0)

iOS不支持。

您需要生成随机计数器(可能是时间刻度)并将其附加到文件名。

答案 4 :(得分: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;
}