2010-05-05 55 views

Trả lời

80

Ví dụ: bằng cách sử dụng một Enumerator thư mục:

NSFileManager *fileManager = [[NSFileManager alloc] init]; 
NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:path];  
NSString *file; 

while (file = [enumerator nextObject]) { 
    NSError *error = nil; 
    BOOL result = [fileManager removeItemAtPath:[path stringByAppendingPathComponent:file] error:&error]; 

    if (!result && error) { 
     NSLog(@"Error: %@", error); 
    } 
} 

Swift

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

Đừng quên kiểm tra xem 'removeItemAtPath:' có thực sự thất bại trước khi thử sử dụng đối tượng lỗi hay không. Ít nhất, bạn có thể báo cáo nhiều lỗi hơn bạn thực sự có. –

+0

@Peter: Rất tiếc, cảm ơn. –

+0

Có sự cố trong vòng lặp while, bạn không thể khai báo biến của bạn bên trong dấu ngoặc đơn !! – Psycho

10

Hãy thử điều này:

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... 
    } 
}  
+0

'contentsOfDirectoryAtPath :: 'không cung cấp cho bạn đường dẫn đầy đủ các nội dung. –

+0

Không cần kiểm tra "." hoặc ".." vì 'contentsOfDirectoryAtPath: error' _filters_ chúng ra; từ tài liệu ** Tìm kiếm cạn và do đó không trả lại nội dung của bất kỳ thư mục con nào. Mảng trả về này không chứa các chuỗi cho thư mục hiện tại (“.”), Thư mục mẹ (“..”), hoặc các nhánh tài nguyên (bắt đầu bằng “._”) và không đi qua các liên kết tượng trưng. ** – petert

+0

@petert Whoa , đây là câu trả lời rất cũ. Cảm ơn bạn về thông tin. –

2

Các tài liệu cho contentsOfDirectoryAtPath:error: nói:

Việc tìm kiếm là nông cạn và do đó không trả lại các nội dung của bất kỳ thư mục con. Mảng trả về này không chứa các chuỗi cho thư mục hiện tại (“.”), Thư mục mẹ (“..”), hoặc các nhánh tài nguyên (bắt đầu bằng “._”) và không đi qua các liên kết tượng trưng.

Như vậy:

---(file != @"." && file != @"..")--- 

là không thích hợp.

0

Tại sao không xóa toàn bộ thư mục và tạo lại sau đó? Chỉ cần nhận các thuộc tính và quyền của tệp trước khi xóa nó và sau đó tạo lại nó với các thuộc tính giống nhau.

+1

Tại sao bạn muốn xóa thư mục và gặp phải các sự cố có thể xảy ra (ví dụ: quyền) nếu bạn chỉ có thể xóa nội dung đó? –

+1

Thường tốt hơn là quét một thư mục và xóa các tệp khỏi mã nguồn vì nó đáng tin cậy hơn nhiều để khôi phục và báo cáo lỗi. – petert

1

Câu trả lời của Georg Fritzsche cho Swift không hiệu quả đối với tôi. Thay vì đọc đối tượng được liệt kê dưới dạng Chuỗi, hãy đọc nó là 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) 
} 
2

Bạn có thể kéo dài tuổi NSFileManager như thế này:

extension NSFileManager { 
    func clearFolderAtPath(path: String) -> Void { 
     for file in subpathsOfDirectoryAtPath(path, error: nil) as? [String] ?? [] { 
      self.removeItemAtPath(path.stringByAppendingPathComponent(file), error: nil) 
     } 
    } 
} 

Sau đó, bạn có thể xóa các thư mục như thế này: NSFileManager.defaultManager().clearFolderAtPath("the folder's path")

5

trong nhanh chóng 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") 
    } 
    } 
} 
3

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.") 
        } 
       } 
      } 
     } 
    } 
} 
2

Swift 3 nếu có ai cần nó cho một cắt/dán nhanh

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) 
    } 
} 
Các vấn đề liên quan