如何删除应用程序上指定目录中的所有文件?

Rex*_*ids 47 filesystems iphone cocoa-touch objective-c

给定目录[[self documentsDirectory] stringByAppendingPathComponent:@"Photos/"]如何删除此文件夹中的所有文件?

(假设文档目录路径正确)

con*_*are 114

NSFileManager *fm = [NSFileManager defaultManager];
NSString *directory = [[self documentsDirectory] stringByAppendingPathComponent:@"Photos/"];
NSError *error = nil;
for (NSString *file in [fm contentsOfDirectoryAtPath:directory error:&error]) {
    BOOL success = [fm removeItemAtPath:[NSString stringWithFormat:@"%@%@", directory, file] error:&error];
    if (!success || error) {
        // it failed.
    }
}
Run Code Online (Sandbox Code Playgroud)

如果它存在的话,我会把它留给你做一些有用的错误.

  • 通常,您应该使用`stringByAppendingPathComponent`而不是`stringWithFormat`来连接路径.(我知道上面的工作,但只是因为你在`@"Photos /"中使用了硬编码的尾部斜杠.) (20认同)
  • 您可能希望将`[fm contentsOfDirectoryAtPath:directory error:&error]`移出`for`循环,这样它就不会在每次迭代时调用该方法.类似于`NSArray <NSString*>*contents = [fm contentsOfDirectoryAtPath:documentsPath error:&error];`和`for(NSString*内容中的文件)` (3认同)
  • 实际上上面的代码是_ades not_ work,因为`stringByAppendingPathComponent`从`@"Photos /"`中删除硬编码的斜杠,这样当你稍后尝试使用`directory`变量时,它不包括应该将它与`file`.一个快速解决方法是在创建`directory`变量时删除硬编码的尾部斜杠,并将斜杠添加到`%@%@之间的`stringWithFormat`调用中. (2认同)

ber*_*ium 16

如果你想删除文件和目录本身,然后使用它没有for循环

NSFileManager *fm = [NSFileManager defaultManager];
NSString *directory = [[self documentsDirectory] stringByAppendingPathComponent:@"Photos"];
NSError *error = nil;
BOOL success = [fm removeItemAtPath:cacheImageDirectory error:&error];
if (!success || error) {
    // something went wrong
}
Run Code Online (Sandbox Code Playgroud)


Prc*_*ela 13

同样对于快速爱好者:

let fm = FileManager.default
do {
  let folderPath = "...my/folder/path"
  let paths = try fm.contentsOfDirectory(atPath: folderPath)
  for path in paths
  {
    try fm.removeItem(atPath: "\(folderPath)/\(path)")
  }
} catch {
  print(error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)