1

我正在尝试创建一个将所选声音文件复制到应用程序目录的应用程序。为此,我编写了以下代码:

NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setAllowsMultipleSelection:NO];
[openDlg setCanChooseDirectories:NO];
[openDlg setAllowedFileTypes:[NSArray arrayWithObjects:@"aif",@"aiff",@"mp3",@"wav",@"m4a",nil]];

if ( [openDlg runModalForDirectory:nil file:nil] == NSOKButton )
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;

    NSString *dataPath = [[NSBundle mainBundle] bundlePath];
    NSLog(@"Datapath is %@", dataPath);
    NSLog(@"Selected Files : %@",[[openDlg URLs] objectAtIndex:0]);
    if ([fileManager fileExistsAtPath:dataPath] == NO)
    {
        [fileManager copyItemAtPath:[[openDlg URLs] objectAtIndex:0] toPath:[[NSBundle mainBundle] bundlePath] error:&error];
        NSLog(@"File copied");

    }
}

问题是我可以选择每种类型的文件(不仅是 aif、wav、mp3 等)而且我从来没有得到File copied. 虽然,路径是正确的。当我删除 if 语句时,我收到一条错误消息 : [NSURL fileSystemRepresentation]: unrecognized selector sent to instance 0x1005a0b90。这段代码有什么问题?

4

1 回答 1

1

您将 传递NSURL给 API,该 API 需要NSString. 您可以考虑使用基于 URL 的 API:

- (BOOL)copyItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL error:(NSError **)error NS_AVAILABLE(10_6, 4_0);

像这样:

[fileManager copyItemAtURL: [[openDlg URLs] objectAtIndex:0] toURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]] error:&error];

另外,我猜该文件已经被复制到包中,因为您的描述表明它[fileManager fileExistsAtPath:dataPath]正在返回NO(因为您的 NSLog 从未执行过。)您可以手动检查,也可以要求NSFileManager删除任何现有文件之前复制到新选择的文件中。

于 2013-05-03T10:52:00.523 回答