2011-04-01 22 views
6

Tengo problemas para borrar todo en un directorio, excepto un archivo (index.dat) Estoy tratando de borrar la carpeta de cookies y la carpeta temporal de los archivos, pero me sale un error cuando intento eliminar index.dat porque está siendo utilizado por otro proceso. ¿Hay alguna manera de eliminar todo en la carpeta temp y cookies excepto el archivo index.dat? Aquí está mi código:Eliminar todo en un directorio excepto un archivo en C#

string userProfile = Environment.GetEnvironmentVariable("USERPROFILE"); 
string strDirLocalq = Path.Combine(userProfile, "AppData"); 
string strDirLocalw = Path.Combine(strDirLocalq, "Roaming"); 
string strDirLocale = Path.Combine(strDirLocalw, "Microsoft"); 
string strDirLocalr = Path.Combine(strDirLocale, "Windows"); 
string strDirLocalt = Path.Combine(strDirLocalr, "Cookies"); 

string[] filePaths = Directory.GetFiles(strDirLocalt); 
foreach (string filePath in filePaths) 
    File.Delete(filePath); 
+3

Puede poner su 'File.Delete()' dentro de un bloque try/catch para manejar archivos que no puede eliminar, sin interrumpir el ciclo (si así lo desea). – Jon

Respuesta

9

Esto funciona:

string[] filePaths = Directory.GetFiles(strDirLocalt); 
foreach (string filePath in filePaths) 
{ 
    var name = new FileInfo(filePath).Name; 
    name = name.ToLower(); 
    if (name != "index.dat") 
    { 
     File.Delete(filePath); 
    } 
} 
+0

Gracias, funcionó. – llk

+0

De nada :-) Lo modifiqué ligeramente para usar la clase FileInfo. – Pol

0

Sólo el filtro de la lista

foreach (string filePath in filePaths.Where(!filePath.Contains("index.dat")) 
    File.Delete(filePath); 
+1

Si tuviera que aplicar esto de manera más genérica, sería una molestia modificar la lista de archivos que se van a omitir. Si tuviera que usar el estilo "donde no", puede ahorrarle tiempo en el futuro para poner todos los archivos omitidos en una matriz estática, luego use 'filePaths.Where (fp =>! Skipped.Any (s => fp.Contains (s))) '... – Jon

3

Basta con colocar un try/catch alrededor del File.Delete porque podría haber más archivos que están en uso, que también arrojará excepciones

try 
{ 
    File.Delete(filePath); 
} 
catch (Exception ignore) 
{ 
} 
+1

Esto es bueno. De todos modos, todavía necesita recorrer los archivos, así que combinaría la solución 2: tster's y Hams's – Adi

0

Por qué no sólo detectar la excepción - no es el possiblility que cualquiera de los archivos podrían estar en uso al intentar eliminarlos.

try{ 
    // delete 
} 
catch{ 
} 
1
string[] filePaths = Directory.GetFiles(strDirLocalt); 
foreach (string filePath in filePaths) 
try { 
    File.Delete(filePath); 
} 
catch{ } 
} 
3

Salida esta solución interesante!

List<string> files = new List<string>(System.IO.Directory.GetFiles(strDirLocalt)); 
files.ForEach(x => { try { System.IO.File.Delete(x); } catch { } }); 

¡Siente la belleza del idioma!

+0

Esto funcionó también. ¡Gracias! Captura cualquier archivo que esté actualmente "en uso" también y bloquea su eliminación. – llk

+0

Lambdas hacen que este placer de lang sea usado :) – Nickon

0

Un método que todavía podría funcionar es que arranque en modo seguro y luego asignar a sí mismo derechos de administrador y luego ver si puede encontrar los archivos para eliminarlos

El método ahora uso es para crear un lote archivo para cambiar el nombre de la subcarpeta debajo de la carpeta que contiene los archivos index.bat y luego solo copiar las carpetas a la ubicación original que no contiene estos archivos, pero los archivos por lotes resultantes deben ejecutarse desde una cuenta de Windows separada que tenga completa permisos de administrador.

Cuestiones relacionadas