iPhone / Цель C: не удается удалить файл - PullRequest
9 голосов
/ 04 августа 2010

В моем приложении я позволяю пользователю записывать аудиоклип, а затем, если пользователь выбирает, я хочу, чтобы он мог удалить его.

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

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 не работает и выдает эту ошибку,

Ошибка: ошибка Домен = NSCocoaErrorDomain Code = 4 UserInfo = 0x391b7f0 "Операция не может быть завершена. (Ошибка какао 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, что, я полагаю, означает ЛОЖЬ.

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

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

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

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];

Ответы [ 3 ]

27 голосов
/ 16 апреля 2011

Ваш чек на (ошибка! = Ноль) неверен. Вы должны установить 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: Использует ли nil для обнаружения Error фактическое отключение отчетов об ошибках?

0 голосов
/ 14 декабря 2010

попробуйте изменить

NSFileManager *fileManager = [NSFileManager defaultManager];

на:

NSFileManager *fileManager = [NSFileManager new];
0 голосов
/ 04 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...