Metodo per iterare la cancellazione di file e directory

di il
4 risposte

Metodo per iterare la cancellazione di file e directory

Ciao,

Sto seguendo un corso on line per passatempo e sto vedendo di capire se ci sto capendo qualcosa dei vari concetti che vengono presentati.

Così ho provato ad inventarmi un esercizio. L'idea è data una directory eliminare la directory tutti i file e le cartelle della directory e sottodirectory utilizzando file.delete().

Il Siccome file.delete() prevede la cancellazione di file e di directory vuote ho pensato di creare un metodo che alimenti un set con le stringhe relative alle sottodirectory che non è possibile cancellare.

Una volta costruito questo set di stringhe l'idea è quella di ciclare il metodo sulle sotto cartelle in modo da eliminarle.

Ho provato a creare quindi un metodo deliteFile che cancella i file e directory vuote e alimenta un set con le directory non vuote.
poi ho creato un altro metodo che dovrebbe iterare il deliteFile per i path non eliminati.
Questi i due metodi

	public void deleteFile(String path) {
		
		Set<String> setDirectory = new HashSet<String>();
		File directoryToDelete = new File(path);		
		File[] files= directoryToDelete.listFiles();
		String dinamicPath=null;
		if (directoryToDelete.isFile()||directoryToDelete.isDirectory()) {
			for (File file : files) {
				dinamicPath = file.getPath();
				if (!file.delete()) {
					setDirectory.add(dinamicPath);
				} else {
					if (directoryToDelete.isDirectory()) {
						setDirectory.remove(dinamicPath);
					}
				}
			}
			if (!setDirectory.isEmpty()) {
				setDirectory.add(path);
			}
			Iterator<String> it = setDirectory.iterator();
			while (it.hasNext()) {
				dirSet.add(it.next());
			}
		}
	}
	
	public void deleteSetFile(Set<String> files) {
		boolean isEmpty= files.isEmpty();
		Iterator<String> it = files.iterator();
		while(it.hasNext()) {
			dirSet.add(it.next());
		}
		while(!isEmpty) {
			Set<String> dinamicDirNotEmpty = dirSet;
			Iterator<String> it2 = dinamicDirNotEmpty.iterator();
			while (it2.hasNext()) {
				deleteFile(it2.next());		
			}
			isEmpty = dirSet.isEmpty();
		}
	}

}
Il problema è che implementato così il deleteSetFile solleva, giustamente, una java.util.ConcurrentModificationException perché il metodo DeleteDirectory modifica gli elementi dell'iterator creando possibili inconsistenze.

volevo chiedere se ci sono modi leciti per gestire delle iterazioni tali per cui all'inizio dell'iterazione non so a prescindere quante iterazioni devo fare?

4 Risposte

  • Re: Metodo per iterare la cancellazione di file e directory

    Approccio inutilmente arzigogolato, pero' e' un possibile approccio, ovviamente

    Come avrai notato, NON PUOI, CONTEMPORANEAMENTE

    1) iterare su una collezione
    2) modificare il contenuto della collezione su cui stai iterando.

    Le soluzioni sono OVVIE

    1) usi un CLONE della collezione per l'iterazione e cancelli il contenuto NELLA collezione originale
    2.1) COLLEZIONI le cose da cancellare
    2.2) ITERI SULLE COSE DA CANCELLARE e le cancelli dalla collezione originale

    Domandona:

    POICHE' un filesystem e' una struttura ad ALBERO,
    QUALE E' il miglior metodo di NAVIGAZIONE per poter cancellare il contenuto di una directory (e delle relative sottodirectory)
    SENZA DIVENTARE MATTI?



    A te, giovane Padawan, l'ardua sentenza
  • Re: Metodo per iterare la cancellazione di file e directory

    Lucadf89 ha scritto:


    Il Siccome file.delete() prevede la cancellazione di file e di directory vuote ho pensato di creare un metodo che alimenti un set con le stringhe relative alle sottodirectory che non è possibile cancellare.

    Una volta costruito questo set di stringhe l'idea è quella di ciclare il metodo sulle sotto cartelle in modo da eliminarle.

    Ho provato a creare quindi un metodo deliteFile che cancella i file e directory vuote e alimenta un set con le directory non vuote.
    poi ho creato un altro metodo che dovrebbe iterare il deliteFile per i path non eliminati.
    Purtroppo ... è una soluzione molto contorta e dispersiva. Quando si ha una struttura ad "albero" c'è un altro modo per poter visitare tutti i nodi da un certo punto in giù.
  • Re: Metodo per iterare la cancellazione di file e directory

    Si effettivamente ci sono un po troppe contorsioni ho una mente malata. Ho dato un occhio alla javadoc e ho visto che c’è il metodo list(FilenameFilter filter) sembra fatto apposta, me lo studio e ci gioco un po’.
    Comunque appena ho margine provo ad implementare anche le soluzioni indicate da migliorabile giusto per prendere confidenza con le collection e iterator.

    Grazie mille a tutti e due
  • Re: Metodo per iterare la cancellazione di file e directory

    Lucadf89 ha scritto:


    ho visto che c’è il metodo list(FilenameFilter filter) sembra fatto apposta
    I list/listFile sono vari ma solo perché cambia cosa restituiscono e se/quale tipo di filtro accettano. Ma non è quello il punto.

    Lucadf89 ha scritto:


    Comunque appena ho margine provo ad implementare anche le soluzioni indicate da migliorabile giusto per prendere confidenza con le collection e iterator.
    Quando si devono trattare strutture ad albero c'è una cosa che bisognerebbe comunque conoscere: il concetto di funzione ricorsiva.
Devi accedere o registrarti per scrivere nel forum
4 risposte