# Logikfehler/falsche Methode? - Grösse von Dateien/Festplatte



## hdi (11. Apr 2008)

Hallo,

ich schreibe gerade ein Programm dass eine oder mehrere Festplatten scannt.
Dabei hangelt es sich einfach durch alle Dateien.

Um grafisch darzustellen, wie weit das Programm schon ist, ermittele ich bevor ich anfange
erstmal die Grösse aller Platten in Bytes (angenommen es ist nur 1 Platte):


```
bytesTotal = festplatte.getTotalSpace() - festplatte.getFreeSpace();
```

dann fange ich mit dem durchhangeln durch die Ordner und Dateien an, und lasse mir dabei
von jeder Datei & Ordner, wo ich gerade bin, die Grösse ermitteln und zu dem Wert hinzuzählen,
der bisher erreicht wurde beim Durchhangeln:

(Die Methode bekommt als Parameter die komplette Festplatte übergeben, genauer:


```
processFile ( festplatte.listFiles());
```


```
private void processFile(File[] files) {

            if(files.length > 0){
            for (int i = 0; i < files.length; i++) {

                // recursive processing until a normal file found

                if (files[i].isDirectory()) {
                    bytesProcessed += files[i].length();   // <- das meine ich! sollte ja auch byte sein
                    if(files[i].listFiles() != null){
                        processFile(files[i].listFiles());
                    }

                // normal file found!
                } else {
                bytesProcessed += files[i].length(); // <- auch hier wird es dazu gezählt
 
                }
            }
            }
        }
```

und jetz das problem:
wenn er fertig ist habe ich nicht 100%, sondern immer nur 82%.
D.h.: Die Grösser aller Dateien und Ordner, durch die er sich gehangelt hat, entspricht am Ende nicht
der Grösse der Plattenbelegung, die ich mir am Anfang geholt habe.

Die Frage ist also: Ist das ein logischer Fehler von mir, oder verwende ich die falschen Methoden für die Ermittlung der Grösse? 

Danke!


----------



## assault (11. Apr 2008)

ich weiß ja nicht aber scannt er wirklich alle dateien?
wie siehts aus mit unsichtbaren Dateien?
Oder gibt es ordner auf die du kein Zugriff  hast (und damit das Prog auch nicht )?

ich hab nicht wirklich ne ahnung aber das wären so 2 punkte die vielleciht was mit dem prob zu tun haben könnten wenn den dein prog richtig funtzt


----------



## SlaterB (11. Apr 2008)

jo, da müsstest du schon eine andere Quelle zum Vergleich heranziehen,
was sagt der Datei-Anzeiger des Betriebsystems zur Gesamtgröße/ zur Größe der 10 Hauptorder,
vergleiche mit Programm, in welchem Bereich Unterschiede bestehen,

keine Lösung, aber dann weißt du eher, was das Problem ist


----------



## Gast (11. Apr 2008)

Ich glaube eher, dass die Methode die echte Größe einer Datei ermittelt und diese stimmt nicht mit dem Speicherbedarf überein. Wenn man sich z.B. mal eine Datei mit 100 Byte anschaut dann ist diese zwar 100 Byte groß, belegt aber trotzdem 4 KB. Daher denke ich, dass es nicht so leicht ist hier einen Status anzuzeigen.


----------



## SlaterB (11. Apr 2008)

man könnte ja zumindest versuchen, das Verhalten nachzubilden,
jede einzelne Dateigröße auf ein Vielfaches von 4KB oder eine sonstige Einheit aufrunden


----------



## tuxedo (11. Apr 2008)

Oder das ganze anders handhaben:

In einem Thread eine Dateiliste der ganzen Platte erstellen lassen und diese Liste einen zweiten Thread, der die Dateien "abarbeitet" zugänglich machen. Einzigster Haken: Man hat nicht sofort eine korrekte Angabe wieviel insgesamt zu erledigen ist. Das passt sich mit fortschreiten der Programmlaufzeit aber an.

Viele andere Programme machens übrigens ähnlich.

- Alex


----------



## Gast (11. Apr 2008)

@alex0801: Wäre wohl sicher ne ganz gute Lösung aber je nachdem wie groß die Festplatte ist würde man da sicher erst mal ne ganze Weile ohne Statusanzeige auskommen müssen. Wenn ich mir vorstelle, dass z.B. ne 1 TB große Festplatte so abgearbeitet wird...
Die Aufmerksamkeit eines Menschen hält im Schnitt ca. 3 Sekunden und nach diesen 3 Sekunden sollte die Anzeige sich so langsam mal bewegen.
Da finde ich den Vorschlag von SlaterB doch um einiges sinnvoller.


----------



## anfänger15 (12. Apr 2008)

wenn das dein problem ist kannst du doch auch einfach einen text z.B. "Vorschau wird erstellt ..." ausgeben


----------



## tuxedo (12. Apr 2008)

@Gast

Du hast nicht verstanden... Die Anzeige aktuelisiert sich die ganze Zeit, mit dem "Nachteil" dass die Anzahl der gefundenen Dateien und der noch zu bearbeitenden Dateien ständig variiert. Zum einen findet er neue Dateien, und zum anderen arbeitet er schon an den bisher gefundenen. 

Erst eine Liste erstellen und warten bis die Liste fertig ist: Dafür braucht kein Mensch 2 Threads. Wenn dann muss beides gleichzeitig laufen damit der User scon von ersten Moment an informiert wird.

Und wie gesagt: Andere Programme machens genauso. D.h. die Benutzerwelt kennt das prozedere teilweise schon.

- Alex


----------



## Gast (14. Apr 2008)

Nur weils andere Programme auch so machen muss diese Lösung noch lange nicht die beste Lösung sein. Ich kenne selber Programme die das wohl genau so machen und ich rege mich jedes mal darüber auf. Meiner Meinung nach gibt es einfach bessere Möglichkeiten das zu lösen.


----------



## tuxedo (14. Apr 2008)

Ich hab ja nicht behauptet dass das die beste Lösung ist. Es ist _EINE_ Lösung. 

Wenn du eine besser Möglichkeit gefunden hast, lass es uns wissen.


----------



## Gast (14. Apr 2008)

Naja wie bereits gesagt halte ich die Idee von SlaterB für ne ganz gute Lösung. Nochmal kurz ne Zusammenfassung wie ich mir das vorstelle:

1. Belegten Speicher auf der Festplatte ermitteln.
2. Ordner durchgehen und die Dateigröße der Dateien ermitteln.
3. Bei jeder Datei prüfen wie viele Byte belegt werden und gegebenenfalls dann aufrunden.
4. Mit dem gerundeten Wert den Status aktualisieren.


----------



## tuxedo (14. Apr 2008)

Bin mir nicht sicher ob das mit jedem System gut funktioniert. Ist doch Dateisystemabhängig wieviel Platz eine Datei letztendlich wirklich verbraucht, oder etwa nicht?

Oder definierst du dein Programm ausschließlich für Windows-Systeme mit NTFS?

Wenn dann in einem Jahgr wieder erwartens das Windows Filesystem raus kommt, und alle Welt "umsteigt" dann könnt's wieder nicht passen.

So ganz scheint mir diese Lösung nicht das gelbe vom Ei zu sein.
Man müsste doch gleich ermitteln können wieviel eine Datei wirklich belegt... Is nur die Frage wie ..

- Alex


----------



## Gast (14. Apr 2008)

Ich kann mir nicht vorstellen, dass es nur mit Java möglich ist den tatsächlichen Speicherbedarf zu ermitteln. Der tatsächliche Speicherbedarf einer Datei ist ja nicht durch das Zählen der Bytes einer Datei möglich.
Daher müsste es eine Möglichkeit geben das File-System zu fragen welche größe die Sektoren haben. Das ist allerdings schon so nah an der Hardware, dass es mit Java wohl nicht möglich ist. Dafür müsste man dann schon eher auf C/C++ zurückgreifen.


----------



## tuxedo (14. Apr 2008)

Okay, dann wäre es andersrum hilfreich wenn Java einem die zur Dateigröße passenden Gesamtdaten nennen kann.

Ist ja schon doof wenn man mit 


```
bytesTotal = festplatte.getTotalSpace() - festplatte.getFreeSpace();
```

an Zahlen kommt die nicht zu dem passen was ich eine einzelne Datei fragen kann....

Hatte eben eine Idee, hab sie aber wieder verworfen. Grundgedanke war:

Einfach das BS fragen wie groß eine Datei ist. Aber "dir" liefert in Windows auch nicht den wirklich belegten Platz einer Datei.
Wenn das funktioniert hätte, hätte man das ganze recht einfach für Windows UND Linux stricken können (Mac müsste sich hier ähnlich wie Linux verhalten).

- Alex


----------

