none
Eliminar todo el contenido de un directorio sin eliminar éste. RRS feed

  • Pregunta

  • Hola.

    Tengo que vaciar un directorio sin eliminar éste mísmo. Pero no conozco ningún otro método que no sea:

    Directory.Delete("Directorio ") : Directory.create("Directorio") 'Ésto no me sirve!

    Gracias por la ayuda que puedan prestarme.

    miércoles, 9 de julio de 2014 21:17

Respuestas

  • Hola, aquí te dejo otra manera de hacerlo. Lo siento, pero está en C#. Te lo he dejado bien comentado para que puedas convertirlo a VB facilmente.

    private void DeleteDirectoryRec(string path, bool deleteThis)
    {
    	//Borra los ficheros
    	List<string> lstFiles = Directory.GetFiles(path).ToList();
    	foreach(string pathFile in lstFiles)
    	{
    		File.Delete(pathFile);
    	}
    
    	//Recursividad para borrar los ficheros y las carpetas hijas
    	List<string> lstChilFolder = Directory.GetDirectories(path).ToList();
    	foreach(string pathFolder in lstChilFolder)
    	{
    		DeleteDirectoryRec(pathFolder, true);
    	}
    
    	//Borra el directorio si deleteThis = true
    	if (deleteThis)
    	{
    		Directory.Delete(path);
    	}
    }

    Para ejecutarlo

    DeleteDirectoryRec(rutaDirectorio, false);

    Se trata de un borrado recursivo con un parametro booleano que índica si borra la carpeta o no. 

    Saludos!!


    Víctor del Valle - http://www.vrdelvalle.net

    • Marcado como respuesta Rafael F M jueves, 10 de julio de 2014 11:58
    jueves, 10 de julio de 2014 11:31

Todas las respuestas

  • puedes hacer algo como esto

    Dim s As String
     For Each s In System.IO.Directory.GetFiles("C:\WINDOWS\TEMP")
     System.IO.File.Delete(s)
     Next s

    he puesto la carpeta Temp de Windows como ejemplo

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 9 de julio de 2014 21:27
  • Gracias por la respuesta Sergio Parra

    Pero solo se eliminan los archivos de TopDirectoryOnly y, tampoco se eliminan las carpetas vacias.

    Con lo siguiente se llegan a eliminar cualquier archivo en cualquier carpeta dentro de éste directorio pero no elimina las carpetas vacías.

                Dim s As String
                For Each s In System.IO.Directory.GetFiles("C:\WINDOWS\TEMP", "*", SearchOption.AllDirectories)
                    System.IO.File.Delete(s)
                Next s
    Gracias de nuevo.

    jueves, 10 de julio de 2014 8:11
  • Aunque un poco aparatoso, creo, he conseguido lo que me proponía.

    Public Sub DeleteEmptyFolders(ByVal Path As String)
    Dim SubDirectories() As String = Directory.GetDirectories(Path)
    For Each strDirectory As String In SubDirectories
    DeleteEmptyFolders(strDirectory)
    Next
    If Directory.GetFiles(Path).Length + Directory.GetDirectories(Path).Length = 0 Then
    Directory.Delete(Path)
    End If
    End Sub 'Fuente (https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=2545&lngWId=10)
    
    Dim s As String
    For Each s In System.IO.Directory.GetFiles("C:\Windows\Temp", "*", SearchOption.AllDirectories)
    System.IO.File.Delete(s)
    Exit For
    Next s
    
    For Each s In System.IO.Directory.GetDirectories("C:\Windows\Temp", "*", SearchOption.AllDirectories)
    DeleteEmptyFolders(s)
    Exit For
    Next s

    A falta de algo más sencillo...

    Gracias.

    jueves, 10 de julio de 2014 8:55
  • Hola, aquí te dejo otra manera de hacerlo. Lo siento, pero está en C#. Te lo he dejado bien comentado para que puedas convertirlo a VB facilmente.

    private void DeleteDirectoryRec(string path, bool deleteThis)
    {
    	//Borra los ficheros
    	List<string> lstFiles = Directory.GetFiles(path).ToList();
    	foreach(string pathFile in lstFiles)
    	{
    		File.Delete(pathFile);
    	}
    
    	//Recursividad para borrar los ficheros y las carpetas hijas
    	List<string> lstChilFolder = Directory.GetDirectories(path).ToList();
    	foreach(string pathFolder in lstChilFolder)
    	{
    		DeleteDirectoryRec(pathFolder, true);
    	}
    
    	//Borra el directorio si deleteThis = true
    	if (deleteThis)
    	{
    		Directory.Delete(path);
    	}
    }

    Para ejecutarlo

    DeleteDirectoryRec(rutaDirectorio, false);

    Se trata de un borrado recursivo con un parametro booleano que índica si borra la carpeta o no. 

    Saludos!!


    Víctor del Valle - http://www.vrdelvalle.net

    • Marcado como respuesta Rafael F M jueves, 10 de julio de 2014 11:58
    jueves, 10 de julio de 2014 11:31
  • Gracias Víctor del Valle.

    He tenido que agregar un On Error Resume Next al principio del código que ofreces.

    Sin ésto, se eliminaria hasta la aparición del primer archivo que se está siendo usado por algún que otro proceso. Después, terminaría el evento sin eliminar los archivos restantes y provocando una exepción.

    jueves, 10 de julio de 2014 11:58