studio registro programacion móviles manejo fichero eliminar elimina directorio desarrollo delete curso borrar archivos archivo aplicaciones java filenames java-io

registro - Eliminar archivos con la misma cadena de prefijo usando Java



manejo de archivos en android studio (11)

Con Java 8:

public static boolean deleteFilesForPathByPrefix(final String path, final String prefix) { boolean success = true; try (DirectoryStream<Path> newDirectoryStream = Files.newDirectoryStream(Paths.get(path), prefix + "*")) { for (final Path newDirectoryStreamItem : newDirectoryStream) { Files.delete(newDirectoryStreamItem); } } catch (final Exception e) { success = false; e.printStackTrace(); } return success; }

Versión simple:

public static void deleteFilesForPathByPrefix(final Path path, final String prefix) { try (DirectoryStream<Path> newDirectoryStream = Files.newDirectoryStream(path, prefix + "*")) { for (final Path newDirectoryStreamItem : newDirectoryStream) { Files.delete(newDirectoryStreamItem); } } catch (final Exception e) { // empty } }

Modifique el argumento Ruta / Cadena según sea necesario. Incluso puedes convertir entre Archivo y Ruta. La ruta es preferida para Java> = 8.

Tengo alrededor de 500 archivos de texto dentro de un directorio con un mismo prefijo en su nombre de archivo, por ejemplo dailyReport_ .

La última parte del archivo es la fecha del archivo. (Por ejemplo, dailyReport_08232011.txt , dailyReport_08232011.txt )

Quiero eliminar estos archivos mediante un procedimiento de Java (podría ir a un script de shell y agregarle un trabajo en el crontab pero la aplicación está destinada a ser utilizada por laicos).

Puedo borrar un solo archivo usando algo como esto

try{ File f=new File("dailyReport_08232011.txt"); f.delete(); } catch(Exception e){ System.out.println(e); }

pero puedo eliminar los archivos que tienen un prefijo determinado (por ejemplo: dailyReport08 para el octavo mes). Podría hacerlo fácilmente en el script de shell utilizando rm -rf dailyReport08*.txt .

Pero el File f=new File("dailyReport_08*.txt"); no funciona en Java (como se esperaba).

Ahora, ¿es posible algo como eso en Java sin ejecutar un bucle que busque archivos en el directorio?

¿Puedo lograr esto usando algunos caracteres especiales similares a * usados ​​en shell script?


Eche un vistazo a Apache FileUtils, que ofrece muchas manipulaciones útiles de archivos.


Estoy de acuerdo con BegemoT.

Sin embargo, solo una optimización: si necesita un FilenameFilter simple, hay una clase en los paquetes de Google. Entonces, en este caso, ni siquiera tiene que crear su propia clase anónima.

import com.google.common.io.PatternFilenameFilter; final File folder = ... final File[] files = folder.listFiles(new PatternFilenameFilter("dailyReport_08.*//.txt")); // loop through the files for ( final File file : files ) { if ( !file.delete() ) { System.err.println( "Can''t remove " + file.getAbsolutePath() ); } }

Disfrutar


Java 8:

final File downloadDirectory = new File("directoryPath"); final File[] files = downloadDirectory.listFiles( (dir,name) -> name.matches("dailyReport_.*?" )); Arrays.asList(files).stream().forEach(File::delete)


No hay un comodín, pero puede implementar un FilenameFilter y verificar la ruta con startsWith("dailyReport_") . Luego, llamar a File.listFiles(filter) le ofrece una serie de archivos que puede recorrer y llamar a delete ().


No puedes hacerlo sin un bucle. Pero puedes mejorar este bucle. En primer lugar, hágale una pregunta: "¿cuál es el problema con la búsqueda y eliminación en el bucle?" Si es demasiado lento por alguna razón, simplemente puede ejecutar su bucle en un hilo separado, para que no afecte a su interfaz de usuario.

Otro consejo: coloque sus informes diarios en una carpeta separada y luego podrá eliminar esta carpeta con todo el contenido.


No, no puedes. Java es un lenguaje de bajo nivel, en comparación con shell-script, por lo que cosas como estas deben hacerse de manera más explícita. Debe buscar los archivos con la máscara requerida con folder.listFiles (FilenameFilter), e iterar a través de la matriz devuelta eliminando cada entrada. Me gusta esto:

final File folder = ... final File[] files = folder.listFiles( new FilenameFilter() { @Override public boolean accept( final File dir, final String name ) { return name.matches( "dailyReport_08.*//.txt" ); } } ); for ( final File file : files ) { if ( !file.delete() ) { System.err.println( "Can''t remove " + file.getAbsolutePath() ); } }


Puedes usar un bucle

for (File f : directory.listFiles()) { if (f.getName().startsWith("dailyReport_")) { f.delete(); } }


Sé que llego tarde a la fiesta. Sin embargo, para futuras referencias, quería contribuir con una solución Java 8 stram que no implique un bucle.

Puede que no sea bonito. Acojo con satisfacción las sugerencias para que se vea mejor. Sin embargo, hace el trabajo:

Files.list(deleteDirectory).filter(p -> p.toString().contains("dailyReport_08")).forEach((p) -> { try { Files.deleteIfExists(p); } catch (Exception e) { e.printStackTrace(); } });

Alternativamente, puede usar Files.walk, que atravesará primero el directorio en profundidad. Es decir, si los archivos están enterrados en directorios diferentes.


Utilice FileFilter como tal:

File dir = new File(<path to dir>); File[] toBeDeleted = dir.listFiles(new FileFilter() { boolean accept(File pathname) { return (pathname.getName().startsWith("dailyReport_08") && pathname.getName().endsWith(".txt")); } for (File f : toBeDeleted) { f.delete(); }


new java.io.File(<<pathStr>>).listFiles.filter(_.getName.endsWith(".txt")).foreach(_.delete())