我试图移动文件。下面我测试路径是否存在。他们这样做,但copyItemAtPath和moveItemAtPath似乎都不起作用。
NSString *testUrl = @"/Users/justinshulman/Documents/test2";
if ([[NSFileManager defaultManager]fileExistsAtPath:testUrl]) {
NSLog(@"yes");
}
NSString *testUrl2 = @"/Users/justinshulman/Documents/test1";
if ([[NSFileManager defaultManager]fileExistsAtPath:testUrl2]) {
NSLog(@"yes");
}
NSLog(@"%@",testUrl);
NSLog(@"%@",testUrl2);
[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:nil];
[[NSFileManager defaultManager]moveItemAtPath:testUrl2 toPath:testUrl error:nil];
答案 0 :(得分:5)
这正是您的问题,如果目标文件已存在,则移动和复制实际上不会覆盖目标文件。您必须先将其删除,然后将另一个文件复制(或移动)到该URL。
尝试
[[NSFileManager defaultManager] removeItemAtPath:testUrl error:nil];
[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:nil];
它应该可以正常工作。
答案 1 :(得分:1)
您还应检查错误,而不是传递nil。
NSError* error = nil;
[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:&error];
if (error != nil) {
NSLog(@"%@", [error localizedDescription]);
}
它还会返回一个关于副本是否成功的bool。
添加到@micantox答案,始终阅读课程参考。见class reference for NSFileManager:
如果dstPath上已存在同名文件,则此方法 中止复制尝试并返回适当的错误。
答案 2 :(得分:0)
您应该在错误归档中传递NSError
个对象。
[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:&error];
Error Domain=NSPOSIXErrorDomain Code=17 UserInfo=0x100457e80 "The operation couldn’t be completed.
[[NSFileManager defaultManager]moveItemAtPath:testUrl2 toPath:testUrl error:&error];
Error Domain=NSCocoaErrorDomain Code=512 UserInfo=0x1004a2270
使用replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:
将第一个URL指定的内容替换为 第二个URL以确保不发生数据丢失的方式。
答案 3 :(得分:0)
@justin,首先它永远不会起作用。因为您尝试将源路径复制到两个路径相同的目标路径。第二件事,NSFileManager如何复制或移动api的工作原理是,您必须将源路径复制或移动到不同的目标路径,并附加适当的路径组件。例如,请参阅以下代码: -
NSString *testUrl = @"/Users/home/Documents/source.rtf";
//
if ([[NSFileManager defaultManager]fileExistsAtPath:testUrl]) {
NSLog(@"yes");
}
//Below destination is folder name which should be exist on your machine or else you can create programmatically as well
NSString *testUrl2 = @"/Users/home/Documents/destination";
NSLog(@"%@",testUrl);
NSLog(@"%@",testUrl2);
NSError *err=nil;
//Now we are copying the souce path to destination folder with appending file name (it can be any your name becuase file manager copy source file contents to your destination file contents)
//Here given file name is a destination.rtf where you can give any your name. Also this is for copying source contents to destination contents
NSFileManager *fm=[NSFileManager defaultManager];
if ([fm copyItemAtPath:testUrl toPath:[testUrl2 stringByAppendingPathComponent:@"destination.rtf"] error:&err])
{
NSLog(@"success");
}
else
{
NSLog(@"%@",[err localizedDescription]);
}