NSFileManager не удаляет файл, который существует

У меня возникла проблема с использованием функций NSFileManager. Это происходит как на симуляторе, так и на устройстве iPhone (iOS 5.1).

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

if ([[NSFileManager defaultManager] isDeletableFileAtPath:path]) {
BOOL success = [[NSFileManager defaultManager] moveItemAtPath:path toPath:[path            stringByAppendingString:@".deleted"] error:&error];
if (!success) {
        NSLog(@"Error removing file at path: %@", error.localizedDescription);
    }
}

Результатом этого является оба файла по пути и path.deleted. В конечном итоге я просто хочу удалить файл с помощью removeItemAtPath, но это не работает. Он возвращает успех, но если я вижу его в каталоге файлов, я все еще вижу его там даже через час.

Ответ 1

Если вы хотите удалить файл, вы должны использовать removeItemAtPath:myPath error:NULL как

NSError *error;
if ([[NSFileManager defaultManager] isDeletableFileAtPath:path]) {
    BOOL success = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
    if (!success) {
        NSLog(@"Error removing file at path: %@", error.localizedDescription);
    }
}

Ответ 2

Используйте это для пути поиска и удалите видео

(NSString *)applicationDocumentsDirectory {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
    }
NSString *dataFilePath = [[[self applicationDocumentsDirectory]
                               stringByAppendingPathComponent:@"Data.nosync"]
                              stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%@.mp4",[dicForDelete valueForKey:keyVideoId],[dicForDelete valueForKey:keyVideoName]]];
NSError *error;
if ([[NSFileManager defaultManager] isDeletableFileAtPath:dataFilePath]) {
        BOOL success = [[NSFileManager defaultManager] removeItemAtPath:dataFilePath error:&error];
        if (success) {
          [email protected]"file deleted ");
        }else
        {
        [email protected]"file not deleted ");
        }
    }   

Ответ 3

Я столкнулся с той же проблемой. Я все еще не понимаю, почему исправление работает, но стоит упомянуть, если другие могут это объяснить.

Я обнаружил, что [[NSFileManager defaultManager] removeItemAtURL:url error:&error] вернет false с первой попытки, но с ошибкой nil. Во второй попытке оно вернется.

Вот как выглядел мой код:

// success == NO error = nil
BOOL success = [[NSFileManager defaultManager] removeItemAtURL:storeUrl error:&error]; 

// success == YES error = nil
success = [[NSFileManager defaultManager] removeItemAtURL:storeUrl error:&error];

Я обнаружил, что если бы я создал свой собственный экземпляр NSFileManager, он работал бы с первой попытки.

NSFileManager *fm = [[NSFileManager alloc] init];
[fm removeItemAtURL:storeUrl error:&error];

Я работаю на симуляторе iOS9. Это пахнет ошибкой. Я собираюсь подать радар.

Ответ 4

Я просто понимаю, что это очень важно, когда вы используете NSFileManager. Вы должны знать о приложении Sandboxing.

let documentDirectory = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0]

Эта строка возвращает каталог документа пути вашего изолированного программного обеспечения. Когда вы создаете файл с FileManager в каталоге документа (например,), не сохраняйте полный путь к файлу, а только путь из текущего каталога документа.

Вы сможете воссоздать полный путь к созданному файлу.

Надежда (через 5 лет) помогает разработчикам; -)