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

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
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):

Code:
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:

Code:
processFile ( festplatte.listFiles());

Code:
   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

Aktives Mitglied
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
 
S

SlaterB

Gast
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 ;)
 
G

Gast

Gast
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.
 
S

SlaterB

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

tuxedo

Gast
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
 
G

Gast

Gast
@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.
 
T

tuxedo

Gast
@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
 
G

Gast

Gast
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.
 
T

tuxedo

Gast
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.
 
G

Gast

Gast
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.
 
T

tuxedo

Gast
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
 
G

Gast

Gast
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.
 
T

tuxedo

Gast
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

Code:
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Wo ist der Logikfehler? Allgemeine Java-Themen 8
M Logikfehler in Eclipse oder Java oder bei mir? Allgemeine Java-Themen 2
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
K Input/Output JUnit: Log Inhalte, falsche Assertion Allgemeine Java-Themen 2
S Ins Falsche Forum gepostet... Allgemeine Java-Themen 0
P BatchUpdateException für falsche Datumsformate anstatt SQLServerException Allgemeine Java-Themen 2
H2SO3- SCJP Chapter 3 Frage 10. Falsche Antwort? Allgemeine Java-Themen 15
P Falsche Ausgabe Allgemeine Java-Themen 5
E Falsche Ergebnisse bei PQ-Formel Berechnung Allgemeine Java-Themen 12
M rxtx OutputStream sendet falsche werte Allgemeine Java-Themen 3
Z new Date() liefert falsche Uhrzeit Allgemeine Java-Themen 12
M Kugelschnittberechnung liefert falsche Werte Allgemeine Java-Themen 4
I Teilweise falsche Darstellung jap. Zeichen im JEditorPane mit RTFEditorKit aus RTF-Datei Allgemeine Java-Themen 5
D falsche Annahme nach korrekter Auswertung (if, boolean) Allgemeine Java-Themen 2
J Calendar gibt falsche Wochenanzahl zurück Allgemeine Java-Themen 3
D Problem mit java.util.scanner: Falsche Ergebnisse Allgemeine Java-Themen 4
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
G Denksport: Der falsche Barren Allgemeine Java-Themen 9
W PrintWriter (PrintStream) sendet falsche Werte Allgemeine Java-Themen 18
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
N URLClassLoader läd falsche Klasse Allgemeine Java-Themen 3
G BigDecimal Rundet falsche Allgemeine Java-Themen 4
G ständig Iterator über Kollektion --> falsche Reihenfolge? Allgemeine Java-Themen 2
H falsche ausgabe Allgemeine Java-Themen 15
S Decimalformat gibt falsche Werte aus Allgemeine Java-Themen 3
A Falsche Werte bei .readDouble() Allgemeine Java-Themen 2
M problem mit packages - falsche einstellungen? Allgemeine Java-Themen 2
D Lesbare args für die main-Methode Allgemeine Java-Themen 6
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben