如何删除 Documents 目录的内容(而不是 Documents 目录本身)?

Posted

技术标签:

【中文标题】如何删除 Documents 目录的内容(而不是 Documents 目录本身)?【英文标题】:How to delete the contents of the Documents directory (and not the Documents directory itself)? 【发布时间】:2011-01-20 15:50:11 【问题描述】:

我想删除 Documents 目录中包含的所有文件和目录。

我相信使用 [fileManager removeItemAtPath:documentsDirectoryPath error:nil] 方法也会删除文档目录。

有没有什么方法可以让你只删除一个目录的内容并将空目录留在那里?

【问题讨论】:

【参考方案1】:

试试这个:

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];

【讨论】:

【参考方案2】:

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)

【讨论】:

感谢您的代码。这些代码也适用于 Swift 5。【参考方案3】:

我认为使用 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)
    

【讨论】:

【参考方案4】:

其他解决方案仅删除表面级别,这将迭代地撕成子目录并清除它们。

此外,一些答案是使用 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];
            
        
    

【讨论】:

以上是关于如何删除 Documents 目录的内容(而不是 Documents 目录本身)?的主要内容,如果未能解决你的问题,请参考以下文章

您是不是需要从 Documents/Inbox 中删除导入的文件?

cmd删除文件文件夹WIN 10内容的想法?

如何删除整个文件夹和内容?

在运行QT中出现 error: No rule to make target `c:/Documents', needed by `debug/Documents.o'

iCloud 是不是会将 Documents 目录中的所有文件上传到云服务器?

Linux之删除带有空格的文件(而不是目录)