Wie löscht man den gesamten Inhalt eines Verzeichnisses, ohne das Verzeichnis selbst zu löschen? Ich möchte grundsätzlich einen Ordner leeren, ihn aber (und die Berechtigungen) intakt lassen.NSFileManager Inhalt des Verzeichnisses löschen
Antwort
Z.B. durch ein Verzeichnis enumerator mit:
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)
}
Versuchen Sie folgendes:
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...
}
}
'contentsOfDirectoryAtPath :: braucht' nicht geben Ihnen den vollständigen Pfad des Inhalts. –
Es besteht keine Notwendigkeit für "." oder ".." seit 'contentsOfDirectoryAtPath: error' _filters_ out; aus docs ** Die Suche ist seicht und gibt daher den Inhalt von Unterverzeichnissen nicht zurück. Dieses zurückgegebene Array enthält keine Zeichenfolgen für das aktuelle Verzeichnis ("."), Übergeordnetes Verzeichnis ("..") oder Ressourcenzweige (beginnt mit "._") und durchläuft keine symbolischen Links. ** – petert
@petert Whoa Das ist eine sehr alte Antwort. Danke für die Information. –
Die Dokumentation für contentsOfDirectoryAtPath:error:
sagt:
Die Suche flach ist und somit nicht den Inhalt aller Unterverzeichnisse zurückgibt. Dieses zurückgegebene Array enthält keine Zeichenfolgen für das aktuelle Verzeichnis ("."), Das übergeordnete Verzeichnis ("..") oder Ressourcenzweige (beginnt mit "._") und durchläuft keine symbolischen Verknüpfungen.
So:
---(file != @"." && file != @"..")---
ist irrelevant.
Warum nicht das gesamte Verzeichnis löschen und danach neu erstellen? Rufen Sie die Dateiattribute und Berechtigungen ab, bevor Sie sie löschen, und erstellen Sie sie anschließend mit denselben Attributen neu.
Warum möchten Sie den Ordner entfernen und auf mögliche Probleme (z. B. Berechtigungen) stoßen, wenn Sie nur den Inhalt entfernen können? –
Es ist oft besser, ein Verzeichnis zu scannen und Dateien aus dem Quellcode zu entfernen, da es weitaus zuverlässiger ist, Fehler zu beheben und zu melden. – petert
Georg Fritzsche Antwort für Swift funktionierte nicht für mich. Anstatt das aufgezählte Objekt als String zu lesen, lesen Sie es als 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)
}
Sie können die NSFileManager
wie folgt erweitern:
extension NSFileManager {
func clearFolderAtPath(path: String) -> Void {
for file in subpathsOfDirectoryAtPath(path, error: nil) as? [String] ?? [] {
self.removeItemAtPath(path.stringByAppendingPathComponent(file), error: nil)
}
}
}
Dann Sie den Ordner wie folgt löschen können: NSFileManager.defaultManager().clearFolderAtPath("the folder's path")
in 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")
}
}
}
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.")
}
}
}
}
}
}
Swift 3, wenn jemand es für einen schnellen Ausschneiden/Einfügen
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)
}
}
- 1. Liste Inhalt des Verzeichnisses (php)
- 2. PHP den Inhalt eines Verzeichnisses löschen
- 3. iPhone: Inhalt des Verzeichnisses "Dokumente" abrufen
- 4. Jenkins Sparse Checkout: nur Inhalt des Verzeichnisses
- 5. Abrufen des aktuellen Verzeichnisses in Objective C
- 6. Kann ich den Inhalt des Verzeichnisses ~/Library/Application Support/iPhone Simulator/6.1/tmp sicher löschen?
- 7. So entfernen Sie ein Verzeichnis und seinen Inhalt mit NSFileManager
- 8. Abrufen des übergeordneten Verzeichnisses des Skripts
- 9. Wie kann ich das Löschen des .git-Verzeichnisses wiederherstellen?
- 10. Durchforsten des Inhalts des aktuellen Verzeichnisses
- 11. Pfad des lokalen Verzeichnisses
- 12. Löschen Sie den Inhalt des Bedienfelds
- 13. Inhalt des Ordners mit Shell-Skript löschen
- 14. Python urllib Download Inhalt eines Online-Verzeichnisses
- 15. Inhalt eines Verzeichnisses in ein anderes kopieren
- 16. Finden Sie den Inhalt eines Verzeichnisses
- 17. Löschen eines Verzeichnisses beim Beenden in Java
- 18. Struktur des IMG-Verzeichnisses react.js
- 19. vagrant.d außerhalb des Home-Verzeichnisses
- 20. PHP Name des aktuellen Verzeichnisses
- 21. auf den Namen des Verzeichnisses
- 22. Limit-Größe des Cache-Verzeichnisses
- 23. Auswählen des richtigen Lucene-Verzeichnisses
- 24. iCloud NSFileManager API - Spielstandsspeicher
- 25. Wie kann ich den gesamten Inhalt eines Verzeichnisses (einschließlich Unterverzeichnissen) mit Ausnahme eines Unterverzeichnisses löschen?
- 26. Cocoa - NSFileManager removeItemAtPath funktioniert nicht
- 27. So ändern Sie die Berechtigung eines Verzeichnisses rekursiv mit NSFileManager setAttributes
- 28. Inhalt der Textdatei löschen
- 29. Sortieren NSFileManager Ergebnisse
- 30. Ist NSFileManager threadsicher?
Vergessen Sie nicht zu überprüfen, ob 'removeItemAtPath:' tatsächlich fehlgeschlagen ist, bevor Sie versuchen, das Fehlerobjekt zu verwenden. Zumindest können Sie mehr Fehler melden, als Sie tatsächlich haben. –
@Peter: Ups, danke. –
Es gibt ein Problem in Ihrer while-Schleife, Sie können die Variable nicht innerhalb der while-Schleife deklarieren !! – Psycho