Использование NSOpenPanel и копирование выбранного файла - Objective-C
Я пытаюсь создать приложение, которое будет копировать выбранный звуковой файл в каталог приложения. Для этого я написал следующий код:
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
, Что не так в этом коде?
1 ответ
Вы передаете NSURL
к API, который ожидает путь в NSString
, Вы можете рассмотреть возможность использования API на основе URL:
- (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
удалить любой существующий файл перед копированием во вновь выбранный файл.