Προς το περιεχόμενο

Java - διατρέχει directory διαγράφοντας αρχεία


Wise_One

Προτεινόμενες αναρτήσεις

Δημοσ.

Είμαι σίγουρος ότι αυτό που θέλω να κάνω είναι πολύ απλό, αλλά με αρχεία κλπ δεν ασχοληθήκαμε πολύ. Προσπαθώντας να καθαρίσω ένα κατάλογο στο σύστημά μου, κρατώντας μόνο συγκεκριμένα αρχεία, σκέφτηκα να κάνω ένα προγραμματάκι.

 

Η αλήθεια είναι ότι ξεκίνησα κάπως πρόχειρα και δεν πήγα και πολύ αντικειμενοστρεφώς, οπότε ψιλοπελάγωσα. Να εξηγήσω λίγο το σκεπτικό μου.

 

Ο κατάλογος:

~/Desktop/dls/Amon Amarth/Fate of Norns/<mp3 files> + other

~/Desktop/dls/Judas Priest/Nostradamus CD1/<mp3 files> + other

~/Desktop/dls/Judas Priest/Nostradamus CD2/<mp3 files> + other

 

Tου δίνω το rootDir και πηγαίνει σ' όλους τους υποκαταλόγους (ίσως να μην είναι μόνο ένα επίπεδο) κρατώντας μόνο τα mp3 και διαγράφοντας ό,τι τυχόν άλλα αρχεία έχει.

 

Ο τρόπος που ξεκίνησα μου φαίνεται χαζός τώρα αλλά έχω κολλήσει και δε μπορώ να σκεφτώ τον αναδρομικό που μάλλον θα δουλέψει καλύτερα.

 

Έχω κάνει λίγο σαλάτα τον κώδικα οπότε μη δείρετε:fear:

>
import java.io.*;

public class DirList{

//Prints the contents of an array
private static String printContents(String[] inputArray){
	StringBuffer output = new StringBuffer("...Contents...");
	
	for(int i = 0; i < inputArray.length; i++){
		output.append("\n" + inputArray[i]);
	}
	
	return output.toString();
}

//Prints a specific array position
private static String printSpec(String[] inputArray, int i){
	return inputArray[i].toString();
}

//Checks if the specified file is a directory
private static void isDire(File rootDir){
	if(rootDir.isDirectory()){
		System.out.println(rootDir.getPath() + " is a directory...");
	}
	else{
		System.err.println(rootDir.getPath() + " is not a directory...");
	}
}

public static void main(String[] args) throws IOException{
	
	File rootDir = new File("/home/vasouv/Desktop/toSortRapidshare/");
	
	//Checks if rootDir is directory
	isDire(rootDir);
	
	//Shows the contents of the directory
	String[] contents = rootDir.list();
	
	System.out.println(printContents(contents));
	
	//Checks if each element is directory
	for(int i = 0; i < contents.length; i++){
		isDire(printSpec(contents,i));
	}
}
}

 

Θα ήθελα να μου πείτε αν το σκεπτικό (με κάποιες αλλαγές προφανώς) είναι καλό για να συνεχίσω, ή να το ξανακάνω αναδρομικά αυτή τη φορά...

 

Thanks anyway...

Δημοσ.

Αν δουλεύεις με Windows 2000/XP, ρίξε μια ματιά στην εντολή κονσόλας del με παράμετρο /S (αυτή η παράμετρος εφαρμόζει την εντολή σε όλα τα αρχεία του folder και των sub-folder του!) και στην attrib με παράμετρο /S (για να προστατέψεις (+R) τα αρχεία από την del) μήπως και σε βοηθήσουν.

 

Φρόντισε όμως να πάρεις ένα καλό backup πριν παίξεις με αυτές τις εντολές διότι αν πάει κάτι στραβά μπορείς να χάσεις όλα τα αρχεία σου!! –σε προειδοποίησα ;)

 

Επίσης μπορείς να το κάνεις και από το Windows Explorer (GUI), απλά κάνε ένα Search στο folder για όλα τα αρχεία του (*.*) και ύστερα κάνε τα αποτελέσματα sort με βάση τον τύπο τους ώστε να ξεσκαρτάρεις γρήγορα όλη την σκαρταδούρα.

 

Αν θέλεις να γράψεις πρόγραμμα ... πάσο :-)

 

Καλή τύχη!!

Δημοσ.

Σε Linux είμαι. Στην αρχή κι εγώ σκέφτηκα να το κάνω με bash script αλλά λέω τί διάολο, ας ασχοληθώ με Java.

 

Πάντως εντάξει, βρήκα κάποια παραδείγματα στο Ιντερνετ (κακώς που δεν έψαξα απ' την αρχή) και λογικά μέχρι το σ/κ θα το έχω φτιάξει. Ελπίζω να θυμηθώ να ποστάρω τον κώδικα.

 

Καλό βράδυ σ' όλους!

Δημοσ.

Μια άσχετη παρατήρηση. Γενικά λόγος που διαχωρίζεται το stdout με το sterr είναι για τις περιπτώσεις που κάνεις ανακατεύθυνση του output ενός προγράμματος σε ένα αρχείο. Δηλαδή στην περίπτωση που κάνει fail η εντολή να μην κάνεις write το error message.

 

Το λεω όχι επειδή είναι λάθος as per se ο κώδικας σου αλλά επειδή η συμπεριφορά, ετσι όπως την βλέπω να υλοποιείται είναι inconsistent.

 

Επίσης υπάρχει μια διαφορετική σύνταξη της for στην java που θα ήταν για παράδειγμα for(String i : contents) το οποίο θα έκανε iterate με τον ίδιο τρόπο μέσα από το array σου, απλά το παραθέτω ως γενικές γνώσεις στην περιπτωση που δεν το γνώριζες (μιας και έιναι ποιο εύκολο σε κάποιες περιπτωσεις να διατρέξεις έτσι το collection σου).

Δημοσ.

Για το sterr έχεις δίκιο, απλά σκοπεύω να το δίνω σε log file οπότε λέω ας το βάλω από τώρα.

 

Ρε φίλε, σ' ευχαριστώ πολύ για την επισήμανση. Αυτοί οι iterators βολεύουν πολύ! Το έχω πετύχει σε κώδικα στο Ιντερνετ και θυμάμαι που σκεφτόμουν "τις συλλογές αντικειμένων καλύτερα να τις διατρέχω μ' αυτόν τον τρόπο", αλλά δεν έτυχε να το δουλέψω.

 

Καλημέρα και χαίρετε!

 

Τον κώδικα τον τέλειωσα. Βέβαια ήξερα απ' την αρχή το βάθος των καταλόγων οπότε κι έκανα εμφωλευμένες επαναλήψεις. Άρα το εύκολο μέρος πέρασε. Μετά τον κώδικα ακολουθεί η σκέψη του δύσκολου μέρους.

 

>
package fdeleter;

/**
* 18-03-09
*
* @author vasouv
*
* The program gets the root directory from the user and deletes all files
* except the .mp3 ones.
* The root directory should have only two levels, for example
* root/level1/level2
*/

import java.io.*;

public class DirFileDeleter {

   public static void main(String[] args) throws IOException{
       BufferedReader input = new BufferedReader(
               new InputStreamReader(System.in));

       //Gets the root directory from the user
       System.out.println("Enter the root directory:");
       String root = input.readLine();

       //Creates the root directory
       File rootDir = new File(root);

       //Creates the root directory contents
       File[] rootContents = rootDir.listFiles();

       //Runs through every element inside the root dir - Level 1
       for (File element : rootContents) {
               
           //Creates the contents of the sub-directory
           File[] elementContents = element.listFiles();

           //Runs through every element in the sub-directory - Level 2
           for (File subContent : elementContents) {

               //Creates the contents of the file level
               File[] fileLevel = subContent.listFiles();

               //Runs through every element in the file level
               for (File file : fileLevel) {

                   //Deletes the files that don't contain .mp3
                   if ((!file.getName().endsWith(".mp3"))
                           && (!file.getName().endsWith(".MP3"))){
                       file.delete();
                   }
               }

           }
         }

    }

}

 

Ο δεύτερος τρόπος (και ίσως πιο δύσκολος) είναι να το κάνω αναδρομικά και να λάβω υπόψη:

  • άγνωστο βάθος κάθε καταλόγου
  • κάθε element ίσως να μην είναι κατάλογος

 

Μια σκέψη που έκανα (κι αν μπορείτε πείτε μου κατά πόσο σωστά σκέφτομαι) είναι να φτιάξω δική μου τάξη File που θα κάνει extend αυτή της Java, και θα έχει μια μέθοδο η οποία θα επιστρέφει τα περιεχόμενα του File, στην περίπτωση που αυτό είναι κατάλογος.

 

Πώς το βλέπετε;

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...