0

我无法在我的 Mac 应用程序中移动由 shell 脚本创建的文件。

该文件似乎保存在:

/Users/USERNAME/Library/Developer/Xcode/DerivedData/APPLICATION_NAME/Build/Products/Debug/

我尝试按如下方式使用 NSFileManager 但没有任何反应:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
[[NSFileManager defaultManager] movePath:[NSString stringWithFormat:@"%/Users/USERNAME/Library/Developer/Xcode/DerivedData/APPLICATION_NAME/Build/Products/Debug/%@", filename] toPath:documentsDirectory handler:nil];

以及尝试使用带有 NSTask 的 shell 脚本移动文件。

我可能做错了什么,有人知道如何将文件从该文件夹移动到 Documents 文件夹甚至更好的桌面吗?

提前谢谢大家

4

1 回答 1

1

要在应用程序包中找到该文件,您需要使用mainBundle. 假设您有一个foo.txt需要定位的文件,并且它存储在标准资源位置,请执行以下操作:

NSBundle *appBundle = [NSBundle mainBundle];
NSString *srcPath = [appBundle pathForResource: @"foo" ofType: @"txt"];

此时,您应该foo.txt在 srcPath 中有路径。

如果要为用户下载文件,则应将其放入用户的 Downloads 目录。如果您下载文件供内部使用,它属于/Library/Application Support/<yourapp>/...~/Library/Application Support/<yourapp>...

找到这些的正确方法是使用NSSearchPathForDirectoriesInDomains.

NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDownloadsDirectory, 
                    NSUserDomainMask, YES);

将产生一个数组(应该是 1 个元素),其中包含当前用户的下载目录路径。如果他们正在请求该文件,您应该将其用作目标路径。

NSArray *paths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory,
                    NSUserDomainMask, YES);

将产生一个数组(应该是 1 个元素),其中包含当前用户的应用程序支持路径。如果这是应用程序内部使用的每个用户下载,则应将其存储在使用附加到此路径的应用程序名称或标识符创建的子目录中。

NSArray *paths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, 
                   NSSystemDomainMask, YES);

将产生一个数组(应该是 1 个元素),其中包含机器的应用程序支持路径。如果这是应用程序内部使用的机器范围下载,则应将其存储在使用附加到此路径的应用程序名称或标识符创建的子目录中。

创建源路径和目标路径后,您需要使用它NSFileManager来将文件移动到位。对于应用程序支持目录,您需要首先验证您想要的目录是否存在,如果不存在,请创建它(使用-createDirectoryAtPath:withIntermediateDirectories:attributes:error)。

NSFileManager *manager = [[NSFileManager alloc] init];
NSError *error;
if (![manager copyItemAtPath: srcPath toPath: dstPath error: &error]) {
    NSLog("Error copying %@ to %@, %@", srcPath, dstPath, error);
}
[manager release];
于 2012-06-08T11:45:08.880 回答