¿Cómo se borran todos los contenidos de un directorio sin eliminar el directorio? Quiero, básicamente, vaciar una carpeta y dejarla intacta (y los permisos).NSFileManager eliminar contenido del directorio
Respuesta
P. ej mediante el uso de un empadronador directorio:
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)
}
Prueba esto:
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 no le da la ruta completa de los contenidos. –
No es necesario realizar la prueba de "." o ".." ya que 'contentsOfDirectoryAtPath: error' _filters_ out; from docs ** La búsqueda es superficial y, por lo tanto, no devuelve el contenido de ningún subdirectorio. Esta matriz devuelta no contiene cadenas para el directorio actual ("."), El directorio padre (".."), o las bifurcaciones de recursos (comienza con "._") y no atraviesa enlaces simbólicos. ** – petert
@petert Whoa , esta es una respuesta muy antigua. Gracias por la info. –
La documentación para contentsOfDirectoryAtPath:error:
dice:
La búsqueda es poco profunda y por lo tanto no devuelve el contenido de todos los subdirectorios. Esta matriz devuelta no contiene cadenas para el directorio actual ("."), El directorio principal ("..") ni las bifurcaciones de recursos (comienza con "._") y no recorre enlaces simbólicos.
Así:
---(file != @"." && file != @"..")---
es irrelevante.
¿Por qué no eliminar todo el directorio y volver a crear después? Simplemente obtenga los atributos y permisos del archivo antes de eliminarlo, y luego recíclelo con los mismos atributos.
¿Por qué querría eliminar la carpeta y encontrarse con posibles problemas (por ejemplo, permisos) si solo puede eliminar su contenido? –
A menudo es mejor escanear un directorio y eliminar archivos del código fuente, ya que es mucho más confiable recuperar e informar errores. – petert
Georg Fritzsche La respuesta para Swift no funcionó para mí. En lugar de leer el objeto enumerado como una cadena, léalo como 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)
}
se puede ampliar el NSFileManager
así:
extension NSFileManager {
func clearFolderAtPath(path: String) -> Void {
for file in subpathsOfDirectoryAtPath(path, error: nil) as? [String] ?? [] {
self.removeItemAtPath(path.stringByAppendingPathComponent(file), error: nil)
}
}
}
A continuación, puede borrar la carpeta de la siguiente manera: NSFileManager.defaultManager().clearFolderAtPath("the folder's path")
en 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 si alguien lo necesita para un corte rápido/pegar
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. Cómo eliminar un directorio y su contenido usando NSFileManager
- 2. Eliminar imagen del directorio de aplicaciones en iPhone
- 3. Contenido del directorio en Haskell
- 4. NSFileManager error al crear el directorio 518 NSFileWriteUnsupportedSchemeError
- 5. NSFileManager & NSFilePosixPermissions
- 6. Lista de contenido del directorio (php)
- 7. NSFileManager - Comprobar el tamaño del archivo?
- 8. Eliminar un directorio de la ruta completa del directorio
- 9. ¿Cómo eliminar los contenidos del directorio de Documentos (y no del directorio de Documentos en sí)?
- 10. Eliminar el atributo readonly del directorio
- 11. hg ¿eliminar el directorio del repositorio?
- 12. Eliminar todo el contenido del archivo
- 13. ¿Cómo eliminar una carpeta y todo su contenido del directorio actual?
- 14. NSFileManager no elimina un archivo que existe
- 15. Cómo mostrar el contenido del directorio del FTP remoto, recursivamente
- 16. Comportamiento raro de irb, listado del contenido del directorio actual
- 17. Objetivo c: Cómo eliminar solo todos los archivos de un directorio pero conservar el directorio
- 18. Git eliminar el directorio
- 19. Eliminar el directorio VSMacros80
- 20. NSFileManager removeItemAtPath bloquea el hilo principal
- 21. Obtenga el contenido completo del directorio con AppleScript
- 22. Listado de contenido del directorio usando C y Windows
- 23. Eliminar contenido de archivos android
- 24. eliminar la estructura del directorio al comprimir archivos en PHP
- 25. iPhone: NSFilemanager fileExistsAtPath: isDirectory: ¿no funciona correctamente?
- 26. Cómo cambiar el permiso de un directorio recursivamente utilizando NSFileManager setAttributes
- 27. ¿Cómo eliminar el directorio recursivamente?
- 28. Cargando una imagen del directorio de documentos
- 29. Cómo eliminar el enlace 'Directorio principal' de la carpeta raíz en la lista del directorio Apache
- 30. Contenido seguro en el directorio de Documentos
No olvide comprobar si 'removeItemAtPath:' realmente falló antes de intentar usar el objeto de error. Por lo menos, puede informar más errores de los que realmente tiene. –
@Peter: Ups, gracias. –
¡Hay un problema en tu ciclo while, no puedes declarar tu variable dentro de los paréntesis while! – Psycho