Autor Beitrag
Raiden5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 25



BeitragVerfasst: Di 15.04.08 12:34 
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.

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 15.04.08 14:22 
Wie kommst du denn auf die komische Rechnung ;) ?
ausblenden C#-Quelltext
1:
prozent = (megaBytes - oldDirSize) * 100 / oldDirSize;					
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 25



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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];
        //  Sicherheitsprüfung für ein "vorher" leeres Verzeichnis
        double diffPercentage = oldDirSize == 0 ?
            100.0 : (currentSize - oldDirSize) * 100.0 / (double)oldDirSize;
        // zur Anzeige direkt verwenden oder per MEGA_BYTE umrechnen
    } 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 25



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