Entwickler-Ecke
Basistechnologien - Ordnergrößen unterschied ermitteln
Raiden5 - Di 15.04.08 12:34
Titel: Ordnergrößen unterschied ermitteln
Halli Hallo,
mal wieder ein Problem.
Ich habe ein Programm das Ordnergrößen anzeigen soll und nach einem erneuten durchlauf, die veränderung der Ordnergröße in % angibt. Habe zwar schon Quellcode geschrieben der mir was ausrechnet aber irgendwie Funzt der nicht ganz so wie ich das gerne hätte. Das Problem was ich habe ist, dass er mir IMMER eine Prozentzahl ausgibt, selbst wenn sich der Ordner in seiner größe nicht geändert hat.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| double megaBytes = (double)currentDirSize / MEGA_BYTE; if (m_currentDir == oldDir) { if (megaBytes == oldDirSize) {
} else { prozent = megaBytes / 100 * oldDirSize; prozentBox.Text = prozent.ToString(); label1.Text = currentDirSize.ToString(); } oldDirSize = megaBytes; } |
currentDirSize ermittelt sich wie folgt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| string[] files = Directory.GetFiles(folder); long currentDirSize = 0;
for(int i = 0; i < files.Length; ++i) { currentDirSize += new FileInfo(files[i]).Length; } |
JüTho - Di 15.04.08 14:22
Hallo,
welcher Prozentwert wird denn angegeben, wenn sich ein Ordner nicht geändert hat?
Ich vermute, das Problem liegt an der "falschen" Verwendung der Zahlen durch NET; weil Du das nicht korrekt beachtest, wird niemals Gleichheit bei "if (megaBytes == oldDirSize)" festgestellt.
Merke: Integer-Division liefert unter C# immer einen Integer.
Double ist ein
ungenauer Datentyp.
Wenn die erste Division wirklich eine Double-Division sein soll, musst Du vielleicht weitere Klammern setzen. Anstelle von double ist
decimal zu empfehlen. Oder bei double darf nicht auf exakte Gleichheit geprüft werden, sondern auf so etwas wie:
C#-Quelltext
1:
| if ( Math.Abs(megaBytes - oldDirSize) < EPSILON ) |
wobei Du festlegen musst, wie klein EPSILON sein soll, damit die Abweichung minimal ist.
Jürgen
Kha - Di 15.04.08 14:22
Wie kommst du denn auf die komische Rechnung ;) ?
C#-Quelltext
1:
| prozent = (megaBytes - oldDirSize) * 100 / oldDirSize; |
JüTho - Di 15.04.08 14:26
@Khabarakh
Es kommt darauf an, welche Prozentangabe gewünscht wird: die Differenz in Prozent oder der neue Wert, prozentual bezogen auf den alten.
Jürgen
Kha - Di 15.04.08 14:49
Huch, wo kam denn dein erster Beitrag auf einmal her :shock: ? Wofür man "MB%" brauchen könnte, habe ich zwar noch nicht ganz verstanden, jedenfalls könnte auch das leere if Schuld sein, denn dadurch bleibt bei keiner Änderung einfach das letzte Ergebnis stehen.
Raiden5 - Mi 16.04.08 15:56
Also ganz genau genommen bei einem einmaligen Durchgang soll er gar nichts rechnen, SOLLTE er aber dasselbe Verzeichnis danach nochmal durchsuchen so soll er die Differenz zur vorherigen größe in % angeben. Ich habs jetzt mal mit int anstatt double versucht allerdings bringt er mir jetzt das Problem das eine Variable (ich vermute oldDirSize) den wert 0 enthält und bekanntlich kann man nicht durch null teilen. Leider kann ich es nicht genau sagen da mein Debugger nicht richtig geht.
JüTho - Mi 16.04.08 18:14
Woher holst Du eigentlich die Vergleichswerte oldDir und oldDirSize?
Ich schlage vor, Du trennst alles:
1. Ein
Dictionary<string, long> pathSizes registriert Pfadnamen und gefundene Größe.
2. Eine Methode
GetCurrentDirSize berechnet die aktuelle Größe (entsprechend zu Deinem zweiten Code im ersten Beitrag).
3. Eine Methode
LookAndCompare liest die aktuelle Größe und gibt, sofern vorhanden, die Prozentangabe:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| void LookAndCompare(string folder) { long currentSize = GetCurrentDirSize(folder); if (pathSizes.ContainsKey(folder)) { long oldDirSize = pathSizes[folder]; double diffPercentage = oldDirSize == 0 ? 100.0 : (currentSize - oldDirSize) * 100.0 / (double)oldDirSize; } else { pathSizes.Add(folder, currentSize); } } |
4. Die "echte" Größe sollte immer "orignal" verwendet werden, also als
long. Jede Umrechnung verfälscht Zwischenrechnungen, sollte also nur dort gemacht werden, wo sie wirklich nötig ist - bei Dir zur Anzeige.
Vorsorglich weise ich darauf hin, dass es keine Standardmethode oder Formatierung gibt, mit der aus Bytes kB oder MB gemacht werden.
Das sollte jetzt wirklich helfen. Jürgen
@Khabarakh
Ich war gestern auch sehr überrascht: Als ich meinen Beitrag abgeschickt hatte, habe ich nur diesen gesehen; aber in der Box "Die letzten 10" stand Deiner schon drin.
Raiden5 - Do 17.04.08 10:09
oldDir ist einfach eine variable typ string in der, der pfad des vorher durchlaufen ordners gespeichert wird.
naja ich probier mal bissl weiter rum
*
edit
*
danke für die mithilfe, habs nun gelöst
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!