Größe eines Directories ermitteln mit allen SubDIR`s

Status
Nicht offen für weitere Antworten.

PELLE

Bekanntes Mitglied
Hallo,

ich weiß das ist rekursion :lol: doch ich habe keinen Plan davon...

hat nicht jemand von euch schon mal sowas gecodet und möchte mich an seiner Weisheit teilhaben lassen?
 
Hier ma meine zusammengebastlete weisheit nachts um halb 4 😛

Code:
public long dirSize(File dir) {

   File[] files = dir.listFiles();
   long size = 0;
   for (File file : files) {
      if (file.isDirectory()) {
         size += dirSize(file);
      }
      else {
         size += file.length();
      }
   }
   return size;
}

Aufgrund der Uhrzeit und der fehlenden Testumgebung: Alle Angaben ohne Gewähr 😉

[edit] Die Uhrzeit hat wohl doch zugeschlagen. Hab ma eben die beiden male, bei denen ich long statt size geschrieben hab ausgebessert :bae:

[edit2] und das .size() (was natülich schwachsinn is) hab ich gleich in das .length() umgewandelt. Ich poste echt nix mehr nach 12 und scho gar net im angetrunkenen Zustand 😳
 
ui so wenig code?? ich dachte das wäre die hammer methode 😛 ich kanns mir aus zeitgründen erst in ner woche testen... bis dann
 
hab das mal in eclipse gepasted und die beiden long müssen wohl eher size heißen oder willst du bytes in einem datentyp speichern;-) 😛

Code:
 public long dirSize(File dir)
      {

    	   File[] files = dir.listFiles();
    	   long size = 0;
    	   for (File file : files) {
    	      if (file.isDirectory()) {
    	         size += dirSize(file);
    	      }
    	      else {
    	         size += file.size(); <----diese size "methode ist undefined for the type file
    	      }
    	   }
    	   return size;
      }
 
Code:
size += file.length();  // Fügt zu size die Größe der Datei in Bytes an
...
double mbsize;
mbsize = size/1024/1024;
 
Code:
int size;
try {
  URLConnection conn = file.toURL().openConnection();
  size = conn.getContentLength();
  conn.getInputStream().close();
} catch(Exception e) {
  e.printStackTrace();
}
 
Sieht doch nur umständlicher aus, oder ?
Er hat ja sowieso die Files in nem Array, da brauch man ja nur jeweils die .length() aufrufen :>
Bei mir sehen die Werte damit auf jeden Fall realistisch aus ...
 
PELLE hat gesagt.:
hab das mal in eclipse gepasted und die beiden long müssen wohl eher size heißen oder willst du bytes in einem datentyp speichern;-) 😛

öhm ... joa ... ich verweise auf die Uhrzeit :wink: *ausbesser* und das mit dem size, was eigentlich als length gedacht war habsch auch gleich mit ausgebessert. Jetzt dürfte es aber gehen :###

[edit] joa, funktioniert so 😀
 
ok hier mal mein ganzer code...

Veränderte Methode von Hobbit im Mega-Rausch:

Code:
 public double dirSize(File dir)
      {
    	   double mbsize;
    	    
    	   File[] files = dir.listFiles();
    	   double size = 0;
    	   for (File file : files)
    	   {
    	      if (file.isDirectory())
    	      {
    	         size += dirSize(file);
    	      }
    	      else
    	      {
    	    	  size += file.length();
    	      }
    	   }
    	   mbsize = size/1024/1024;
    	   return mbsize;
      }

Methode von mir die oberste verzeichnisse eines Laufwerks als string in eine JComboBox einliest zum bequemen auswählen:

Code:
      public void SourceDirectoryCBEinlesen()
      {
          File path = new File(SettingsPanel.sourceDirDefaultTF.getText());
          FileFilter filefilter = new FileFilter()
          {
             public boolean accept(File file)
             {
                return file.isDirectory();
             }
          };
          File[] zipfiles = path.listFiles(filefilter);
          for(int i = 0 ; i < zipfiles.length ; i++)
          {
            SourceDirectoryCB.addItem(zipfiles[i].getName()); 
            
            double a =  *****dirSize*****(path.getAbsolutePath());  <---- das ist das dirSize in der fehlermeldung
            String dirMB = String.valueOf(a);         
            homepageTF.setText(dirMB);
          }        
          
      }


*****
Severity and Description Path Resource Location Creation Time Id
The method dirSize(File) in the type MainWindow.RePanel is not applicable for the arguments (String) i MainWindow.java line 339 1152355189000 1166

ic weißt getAbsolutePath gibt string zurück und dirSize will eine variable vom typ File nur wie übergebe ich dirSize ein Unterverzeichnis von typ file wenn path zB. L : / ist und unterverzeichns das L : /unterverzeichnis?


obiger code: in dem moment wo die methode SourceDirectoryCBEinlesen aufgerufen wird , werden alle verzeichnisse auf dem bestimmten laufwerk x eingelesen in die JCBox und die größe des verzeichnisses wird im textfield homepageTF ausgegeben!

obwohl keine zeit doch damit beschäftigt... 😛
 
1. was willst du jetzt genau machen? Einen Laufwerkbuchstaben und einen Pfad zusammenfügen? Warum verwendest du keinen JFileChooser?

2. Zur richtigen Berechnung der MegaByte bitte folgenden Artiekl mit Augenmerk auf den Unterschied zwischen MebiByte und MegaByte legen

http://de.wikipedia.org/wiki/Speicherkapazität

und nein, dass ist kein Fehler im Wiki, sondern offiziell so. Daher kommt auch die Differenz von einer Festplatte (z. B. 80GigaByte) und die Anzeige unter Windows (ein bisschen weniger, grob geschätzt 76 GibiByte).
 
zu 1. verzeichnis in JCBox einlesen und größe ermitteln will kein filechooser nehmen


zu 2. das mit den 1024/1024 kommt net von mir hab ich so gedankenlos übernommen...
 
ich verstehs immer noch net (restalkohol???) Wenn du die Größe von L:\ haben willst rufst du dirSize so auf

Code:
long size = dirSize(new File("L:\\");

und wenn du die Größe von L:\ unterverzeichnis haben möchtest rufst du dirSize so auf

Code:
long size = dirSize(new File(laufwerk + unterverzeichnis));

musst halt darauf achten, dass laufwerk + unterverzeichnis zusammen z. B. sowas ergen C:/Daten/Downloads o. ä.
 
Dass die Festplattenhersteller fälschlicherweise für 1KB nur 1000 statt 1024 Bytes nehmen, ändert doch nichts daran, dass 1024 die richtige Zahl ist, oder?

Daher: size / 1024 ==> KB / 1024 ==> MB
 
hm, nein. Die Festplattenhersteller nehmen die richtige Zahl, weil Kilo = 1.000, Mega 1.000.000, usw. usf. ist und nicht 1024. 1024 kommt durch das binär-System (Zweiersystem), daher hat man irgendwann mal vor ein paar Jahren um Missverständnisse vorzubeugen KibiByte, MebiByte, GibiByte, ... eingeführt. das bi steht für binary also 2-er System. Beachtet nur keine Sau und ist dem größten Teil der Leute unbekannt. Da ich mich aber schulisch vor einiger Zeit damit beschäftigen musste, bin ich auch auf die für mich zuerst sehr verwirrende Information gestosen.

[edit] also KB und MB usw. ist eigentlich schon richtig, nur steht das nicht für MegaByte oder KiloByte sondern für MebiByte bzw. KibiByte. Die offizielle Abkürzung für KiloByte wäre kB also Anfangsbuchstabe klein. Ist im Endeffekt nur ne formelle Sache.
 
Aha Interessant. Ich habe diese Begriffe (Kibi... , Mebi..., ...) noch nie gehört, und das obwohl ich auf ner Schule mit Fachrichtung Informatik gehe 🙂

Aber ich denke durch 1024 zu teilen dürfte nichtsdesdotrotz in Ordnung sein (jedenfalls ist die angezeigte Größe genauso wie im Explorer).
 
joa, wollte nur ein bisschen kniebohrerisch sein 😉 .

Hatte wie gesagt auch lang nichts davon gehört.
 
Hobbit_Im_Blutrausch hat gesagt.:
ich verstehs immer noch net (restalkohol???) Wenn du die Größe von L:\ haben willst rufst du dirSize so auf

Code:
long size = dirSize(new File("L:\\");

und wenn du die Größe von L:\ unterverzeichnis haben möchtest rufst du dirSize so auf

Code:
long size = dirSize(new File(laufwerk + unterverzeichnis));

musst halt darauf achten, dass laufwerk + unterverzeichnis zusammen z. B. sowas ergen C:/Daten/Downloads o. ä.

das 2.wollte ich danke hobbit das geht mit sicherheit 🙂 melde mich nächste woche dann :lol:
 
haha sheisse ja obwohl ich lernen sollte 😛


hm wenn ich dateienen in L:/bla habe gibt er mir die größe aus der datei in megabyte aber die größe vom verzeichnis L:/bla/bla1 ist immer 0 ich denke weil sich da keine datei befindet sondern nur wiederum verzeichnisse mit unterverzeichnissen , lege ich aber in das verzeichnis ne 8 mb datei meldet mir java auch braw 8 mb als size. ich denke deine methode geht nicht entweder in die unterverzeichnisse rekursiv oder sie findet nur dateien??? :bahnhof:
 
Code:
public double dirSize(File dir) 
      { 
          double mbsize; 
           
          File[] files = dir.listFiles(); 
          double size = 0; 
          for (File file : files) 
          { 
             if (file.isDirectory()) 
             { 
                size += dirSize(file);  //hier erfolgt der rekusrsive aufruf für Directorys sollte also gehen
             } 
             else 
             { 
                size += file.length(); 
             } 
          } 
          mbsize = size/1024/1024; 
          return mbsize; 
      }
 
1. siehe Brainiac's Erklärung bzw. kommentar
2. habsch mein komplettes C:\ Laufwerk damit ausgelesen, und ich glaub net, dass da 13 GB allein in C selbst ohne Unterodner liegen 😉
 
jo, ich erwarte nach ein paar Einheiten schlaf deine antwort ...

btw: bist du eigentlich immer on, wenn ich auch on bin? Du beschadest mich doch heimlich ... gebs zu :autsch: :bae:
 
haha ok ich bin java süchtig geworden ^^

long a = dirSize(new File("K : //Natalie"));

ich bekomme 3300 mb von java, das sind aber nur die dateien in Natalie verzeichnis, doch die verzeichnisse in natalie/ werden nicht summiert zu den files die in K : //Natalie liegen? komisch...
 
joa, ich kann dir sagen woran das liegt, weil derjenige, der hier meine Methode um die MBs erweitert hat gepfuscht hat. Du addierst hier nämlich bei jedem unterordner mb (die behandelt werden wie bytes) mit bytes und erstellst daraus dann nochmal die mb. Von daher haste viel weniger. Wie wärs wenn du meine Methode ohne MB nimmst? Dann sollte es gehen. Kannst ja noch ne 2. Methode bauen, mit der du dann deren ergebnis in MB umrechnest und zurück gibst. Hab in meinem 1. post alle suff-Fehler ausgebessert, kannst sie also 1 zu 1 übernehmen.
 
ok danke dir, werd ich machen;-)

explorer im windows: (68.243.492.173 Bytes)
java: 68243492173

na das kommt doch hin :applaus: :applaus: :toll:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben