Как удалить содержимое папки «Документы» (а не саму папку «Документы»)?

Я хочу удалить все файлы и каталоги, содержащиеся в каталоге Documents.

Я считаю, что использование метода [fileManager removeItemAtPath:documentsDirectoryPath error:nil] также удалит каталог документов.

Есть ли способ, который позволяет удалить содержимое только каталога и оставить там пустой каталог?


person NSExplorer    schedule 20.01.2011    source источник


Ответы (4)


Попробуй это:

NSString *folderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSError *error = nil;
for (NSString *file in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:&error]) {
    [[NSFileManager defaultManager] removeItemAtPath:[folderPath stringByAppendingPathComponent:file] error:&error];
}
person cmlloyd    schedule 20.01.2011

Swift 3.x

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
guard let items = try? FileManager.default.contentsOfDirectory(atPath: path) else { return }

for item in items {
    // This can be made better by using pathComponent
    let completePath = path.appending("/").appending(item)
    try? FileManager.default.removeItem(atPath: completePath)
}
person footyapps27    schedule 31.07.2017
comment
Спасибо за коды. Коды также работают с Swift 5. - person said altintop; 08.06.2021

Я думаю, что работа с URL-адресами вместо String упрощает работу:

private func clearDocumentsDirectory() {
    let fileManager = FileManager.default
    guard let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return }

    let items = try? fileManager.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil)
    items?.forEach { item in
        try? fileManager.removeItem(at: item)
    }
}
person Jakub Sowa    schedule 17.05.2018

Другие решения удаляют только уровень поверхности, это будет итеративно разрывать подкаталоги и очищать их.

Кроме того, в некоторых ответах используется removeItem: с локальным путем только к самому файлу вместо полного пути, который требуется операционной системе для правильного удаления.


Просто позвоните [self purgeDocuments];

+(void)purgeDocuments __deprecated_msg("For debug purposes only") {
    NSString *documentDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    [self purgeDirectory:documentDirectoryPath];
}

+(void)purgeDirectory:(NSString *)directoryPath __deprecated_msg("For debug purposes only") {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *directoryContent = [fileManager contentsOfDirectoryAtPath:directoryPath error:&error];
    for (NSString *itemPath in directoryContent) {
        NSString *itemFullPath = [NSString stringWithFormat:@"%@/%@", directoryPath, itemPath];
        BOOL isDir;
        if ([fileManager fileExistsAtPath:itemFullPath isDirectory:&isDir]) {
            if (isDir) {
                [self purgeDirectory:itemFullPath];//subdirectory
            } else {
                [fileManager removeItemAtPath:itemFullPath error:&error];
            }
        }
    }
}
person Albert Renshaw    schedule 25.02.2021