Objective c moveItemAtPath。没有错误,但不工作

Objective c moveItemAtPath。没有错误,但不工作,objective-c,cocoa,nsfilemanager,Objective C,Cocoa,Nsfilemanager,我正在尝试移动文件。下面我正在测试路径是否存在。但是,copyItemAtPath和moveItemAtPath似乎都不起作用 NSString *testUrl = @"/Users/justinshulman/Documents/test2"; if ([[NSFileManager defaultManager]fileExistsAtPath:testUrl]) { NSLog(@"yes"); } NSString *testUrl2 = @"/Users/justinshul

我正在尝试移动文件。下面我正在测试路径是否存在。但是,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];

这正是您的问题所在,如果目标文件已经存在,则移动和复制实际上都不会覆盖该文件。您必须先删除它,然后将另一个文件复制(或移动)到该URL

试一试

[[NSFileManager defaultManager] removeItemAtPath:testUrl error:nil];
[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:nil];

它应该可以正常工作。

这正是您的问题,如果目标文件已经存在,则移动和复制实际上都不会覆盖目标文件。您必须先删除它,然后将另一个文件复制(或移动)到该URL

试一试

[[NSFileManager defaultManager] removeItemAtPath:testUrl error:nil];
[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:nil];

它应该可以正常工作。

您还应该检查错误,而不是传递nil

NSError* error = nil;

[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:&error];

if (error != nil) {
   NSLog(@"%@", [error localizedDescription]);
}
它还返回关于复制是否成功的布尔值

在@micantox answer中添加内容时,请务必阅读课堂参考。见:

如果dstPath中已存在同名文件,则此方法 中止复制尝试并返回相应的错误


您还应该检查错误,而不是传递nil

NSError* error = nil;

[[NSFileManager defaultManager]copyItemAtPath:testUrl2 toPath:testUrl error:&error];

if (error != nil) {
   NSLog(@"%@", [error localizedDescription]);
}
它还返回关于复制是否成功的布尔值

在@micantox answer中添加内容时,请务必阅读课堂参考。见:

如果dstPath中已存在同名文件,则此方法 中止复制尝试并返回相应的错误


您应该在错误字段中传递
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
使用
replaceItemAttribute:WithItemAttribute:backupItemName:options:resultingItemURL:error:

将第一个URL指定的内容替换为 第二个URL确保不会发生数据丢失


您应该在错误字段中传递
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
使用
replaceItemAttribute:WithItemAttribute:backupItemName:options:resultingItemURL:error:

将第一个URL指定的内容替换为 第二个URL确保不会发生数据丢失


@贾斯汀,第一件事,它永远不会只起作用。因为您正在尝试将源路径复制到两个路径相同的目标路径。第二件事,NSFileManager复制或移动api的工作原理是,您必须将源路径复制或移动到不同的目标路径,并附加适当的路径组件。例如,请参见下面的代码:--


@贾斯汀,第一件事,它永远不会只起作用。因为您正在尝试将源路径复制到两个路径相同的目标路径。第二件事,NSFileManager复制或移动api的工作原理是,您必须将源路径复制或移动到不同的目标路径,并附加适当的路径组件。例如,请参见下面的代码:--


让我知道,如果你仍然在这方面遇到任何问题,你也可以这样写这行NSString*testUrl2=@“/Users/home/Documents/destination/destination.rtf”;尽管通过在下面复制api中附加PathComponent代码来编写此StringBy。这只是为了你的理解所提到的。事先对不起,这真的很新鲜。我要做的是创建一个程序,将文件或文件夹移动到指定的文件夹中。你在上面展示的是通过修改来完成的还是我偏离了轨道了?是的,同样的事情你可以使用这个moveItemAtPath,尽管使用这个CopyItemAtPath,还有一件事,如果你想移动子文件夹,那么不要添加文件扩展名,否则它将创建为文件,只提供名称wo文件扩展名让我知道,如果您仍然在这方面遇到任何问题,您也可以这样写这一行NSString*testUrl2=@“/Users/home/Documents/destination/destination.rtf”;尽管通过在下面复制api中附加PathComponent代码来编写此StringBy。这只是为了你的理解所提到的。事先对不起,这真的很新鲜。我要做的是创建一个程序,将文件或文件夹移动到指定的文件夹中。您在上面展示的内容是通过修改完成的,还是我偏离了轨道?是的,您可以做的同样的事情就是使用此moveItemAtPath,而不是使用此CopyItemAtPath。还有一件事,如果您想移动子文件夹,请不要添加文件扩展名,否则它将创建为文件,仅以名称命名wo文件扩展名删除您需要的文件你打算先搬家吗?这不是另一种方式吗?我只是简单地确保如果testUrl位置有一个文件,那么在复制新文件(这是OP所要求的)之前将其删除。首先删除您要移动的文件?这不是另一种方式吗?我只是确保如果testUrl位置有一个文件,那么在复制新文件之前将其删除(这是OP所要求的)