Как удалить все содержимое каталога без удаления самой директории? Я хочу, чтобы в основном пустую папку, но оставить ее (и разрешения) нетронутыми.
NSFileManager удаляет содержимое каталога
Ответ 1
например. с помощью перечислителя каталогов:
NSFileManager* fm = [[[NSFileManager alloc] init] autorelease];
NSDirectoryEnumerator* en = [fm enumeratorAtPath:path];
NSError* err = nil;
BOOL res;
NSString* file;
while (file = [en nextObject]) {
res = [fm removeItemAtPath:[path stringByAppendingPathComponent:file] error:&err];
if (!res && err) {
NSLog(@"oops: %@", err);
}
}
Свифта
let fileManager = NSFileManager.defaultManager()
let enumerator = fileManager.enumeratorAtURL(cacheURL, includingPropertiesForKeys: nil, options: nil, errorHandler: nil)
while let file = enumerator?.nextObject() as? String {
fileManager.removeItemAtURL(cacheURL.URLByAppendingPathComponent(file), error: nil)
}
Ответ 2
Попробуйте следующее:
NSFileManager *manager = [NSFileManager defaultManager];
NSString *dirToEmpty = ... //directory to empty
NSError *error = nil;
NSArray *files = [manager contentsOfDirectoryAtPath:dirToEmpty
error:&error];
if(error) {
//deal with error and bail.
}
for(NSString *file in files) {
[manager removeItemAtPath:[dirToEmpty stringByAppendingPathComponent:file]
error:&error];
if(error) {
//an error occurred...
}
}
Ответ 3
в swift 2.0:
if let enumerator = NSFileManager.defaultManager().enumeratorAtPath(dataPath) {
while let fileName = enumerator.nextObject() as? String {
do {
try NSFileManager.defaultManager().removeItemAtPath("\(dataPath)\(fileName)")
}
catch let e as NSError {
print(e)
}
catch {
print("error")
}
}
}
Ответ 4
Swift 2.1.1:
public func deleteContentsOfFolder()
{
// folderURL
if let folderURL = self.URL()
{
// enumerator
if let enumerator = NSFileManager.defaultManager().enumeratorAtURL(folderURL, includingPropertiesForKeys: nil, options: [], errorHandler: nil)
{
// item
while let item = enumerator.nextObject()
{
// itemURL
if let itemURL = item as? NSURL
{
do
{
try NSFileManager.defaultManager().removeItemAtURL(itemURL)
}
catch let error as NSError
{
print("JBSFile Exception: Could not delete item within folder. \(error)")
}
catch
{
print("JBSFile Exception: Could not delete item within folder.")
}
}
}
}
}
}
Ответ 5
В документации для contentsOfDirectoryAtPath:error:
указано:
Поиск неглубокий и, следовательно, не возвращает содержимое любых подкаталогов. Этот возвращенный массив не содержит строки для текущего каталога ( "." ), Родительского каталога ( ".." ) или вилки ресурсов (начинаются с "._" ) и не пересекаются с символическими ссылками.
Таким образом:
---( file != @"." && file != @".." )---
не имеет значения.
Ответ 6
Вы можете выполнить NSFileManage
следующим образом:
extension NSFileManager {
func clearFolderAtPath(path: String) -> Void {
for file in subpathsOfDirectoryAtPath(path, error: nil) as? [String] ?? [] {
self.removeItemAtPath(path.stringByAppendingPathComponent(file), error: nil)
}
}
}
Затем вы можете очистить папку следующим образом: NSFileManager.defaultManager().clearFolderAtPath("the folder path")
Ответ 7
Swift 3, если кому-то это нужно для быстрого вырезания/вставки
let fileManager = FileManager.default
let fileUrls = fileManager.enumerator(at: folderUrl, includingPropertiesForKeys: nil)
while let fileUrl = fileUrls?.nextObject() {
do {
try fileManager.removeItem(at: fileUrl as! URL)
} catch {
print(error)
}
}
Ответ 8
Ответ Георга Фрицше для Свифта не помог мне. Вместо чтения перечисленного объекта в виде строки, прочитайте его как NSURL.
let fileManager = NSFileManager.defaultManager()
let url = NSURL(string: "foo/bar")
let enumerator = fileManager.enumeratorAtURL(url, includingPropertiesForKeys: nil, options: nil, errorHandler: nil)
while let file = enumerator?.nextObject() as? NSURL {
fileManager.removeItemAtURL(file, error: nil)
}
Ответ 9
Почему бы не удалить весь каталог и впоследствии воссоздать? Просто удалите атрибуты и разрешения файлов перед их удалением, а затем заново создайте его с теми же атрибутами.