2010-08-04 5 views
9

В моем приложении я разрешаю пользователю записывать звуковой клип, а позже, если пользователь выбирает, я хочу, чтобы он смог его удалить.iPhone/Objective C: Не удается удалить файл

Это код, я использую:

NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error; 
NSLog(@"File exists: %d", [fileManager fileExistsAtPath:path]); 
NSLog(@"Is deletable file at path: %d", [fileManager isDeletableFileAtPath:path]); 
[fileManager removeItemAtPath:path error:&error]; 
if (error != nil) 
{ 
    NSLog(@"Error: %@", error); 
    NSLog(@"Path to file: %@", path); 
} 

Проблема заключается в том, что fileExistsAtPath и isDeletableFileAtPath возвращение нуль и removeItemAtPath не работает, и выдает эту ошибку,

Error: Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x391b7f0 "Operation could not be completed. (Cocoa error 4.)"

Путь имеет эта форма:

/Users/andrei/Library/Application%20Support/iPhone%20Simulator/User/Applications/5472B318-FA57-4F8D-AD91-7E06E9609215/Documents/1280913694.caf 

Существует файл, который называется 1280913694.caf, но он не подбирает его. Связано ли это с тем, как должен быть представлен путь?

Путь работает при воспроизведении аудиофайла с AVAudioPlayer.

Я также изменил %@ к %d для fileExistsAtPath и isDeletableFileAtPath и ответ 0, который я предполагаю, означает FALSE.

Имя файла хранится в базе данных, и путь к файлу можно получить с помощью этого метода:

-(NSString *)returnFullPathToDirectory 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return documentsDirectory; 
} 

После того как я получить это значение, я использую его в следующем коде

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName]; 
+1

Пожалуйста, измените два '% @' перед '-removeItemAtPath' на'% d' и запустите снова. – kennytm

+0

обратите внимание, что файл: // префикс должен быть удален, т. Е. Преобразовать в NSURL и получить атрибут .path (как и путь выше) – ThomasRS

ответ

26

Ваш чек на неверен. Вы должны установить BOOL в возвращаемое значение метода и использовать его для обработки условий ошибки, поскольку это возможно для успешного завершения метода и для ошибки, которая будет не равна нулю. Таким образом, файл может быть удален, но вы получаете неправильную ошибку.

Вы также не должны пытаться удалить файл, если он не существует.

Кроме того, я обычно просто войти localizedDescription ошибка, как это легче читать

Этот код работает в моем проекте (путь был определен в другом месте):

NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    BOOL fileExists = [fileManager fileExistsAtPath:path]; 
    NSLog(@"Path to file: %@", path);   
    NSLog(@"File exists: %d", fileExists); 
    NSLog(@"Is deletable file at path: %d", [fileManager isDeletableFileAtPath:path]); 
    if (fileExists) 
    { 
     BOOL success = [fileManager removeItemAtPath:path error:&error]; 
     if (!success) NSLog(@"Error: %@", [error localizedDescription]); 
    } 

, связанные с ответом: NSError: Does using nil to detect Error actually turn off error reporting?

0

Путь к файлу с кодировкой url выглядит подозрительно для меня. Я читал где-то, что пути файлов iPhone должны быть представлены как URL-адрес в эти дни, но я не думаю, что пробелы должны быть закодированы по URL-адресу.

Попробуйте удалить% 20 ​​из вашего пути и повторите попытку?

+1

Я разрешаю путь к файлу: **/Пользователи/andrei/Library/Поддержка приложений/iPhone Simulator/User/Applications/0547AE74-AD10-4BEF-98CF-8FFF5BB2F70F/Documents/1280913694.caf ** так, нет% 20, и теперь ... что странно, это говорит мне, что файл не существует (возвращает 0 в файлеExistsAtPath), но также и то, что файл можно удалить (возвращает 1 в isDeletableFileAtPath). Ошибка по-прежнему сохраняется и не удаляет файл. – Andrei

+0

Не могли бы вы вывести код, который вы используете, чтобы получить путь? – Jasarien

+0

опубликовано в исходном вопросе как второе редактирование (** edit2 **) – Andrei

-8

попытаться изменить

NSFileManager *fileManager = [NSFileManager defaultManager]; 

к: (! Ошибка = ноль)

NSFileManager *fileManager = [NSFileManager new]; 
+4

Ух, нет. С самого начала он имел на это право. –

+0

Разве это даже правильная цель-c? – Jason

Смежные вопросы