我想在复制文件时在iOS-App中使用OSX行为:如果存在,请附加一个计数器:
是否有内置方法可以执行此操作,还是我必须自己构建该功能?我找不到那样的东西,但我不认为我是第一个需要这种行为的人......
答案 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中的moveItemAtURL
或moveItemAtPath
将其移动到正确的位置。
答案 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;
}