none
Ordnergröße ermitteln RRS feed

  • Frage

  • Hallo,

    Ich habe ein Backup Programm als Projekt und bekomme es irgendwie nicht hin, dass ich die Größe der Ordner (mit ihren Dateien drin ) herausbekomme.

    Deswegen wollte ich mal fragen wie das geht:

    Bei den Dateien mache ich das so:

           Try
    
                Dim file As String
                For Each file In OpenFileDialog1.FileNames
                    Dim infoReader As System.IO.FileInfo
                    infoReader = New FileInfo(file)
    
                    With ListView1.Items.Add(IO.Path.GetFileNameWithoutExtension(file))
                        If TextBox2.Text = "" Then
                            TextBox2.Text = "1"
                        Else
                            TextBox2.Text = (Integer.Parse(TextBox2.Text) + 1).ToString()
                        End If
                        .SubItems.Add(roundandreturnfilesize(infoReader.Length))
                        If TextBox1.Text = "" Then
                            TextBox1.Text = infoReader.Length.ToString()
                        Else
                            TextBox1.Text = (Long.Parse(TextBox1.Text) + infoReader.Length).ToString()
                        End If
    
                        .SubItems.Add(IO.Path.GetExtension(file))
                        .SubItems.Add(IO.Path.GetFullPath(file))
                        .SubItems.Add(IO.File.GetCreationTime(file).ToString())
                        .SubItems.Add(IO.File.GetLastWriteTime(file).ToString())
                        .SubItems.Add(IO.Path.GetPathRoot(file))
                        .SubItems.Add(TextBox2.Text)
    
                        Label4.Text = ListView1.Items.Count.ToString()
                        Label6.Text = roundandreturnfilesize(Double.Parse(TextBox1.Text))
    
    
                    End With
                Next file
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

        Public Function roundandreturnfilesize(ByVal size As Double) As String
           
            Select Case size
                Case Is < 1000
                    If size > 0 Then
                        Return Math.Round(size, 2).ToString & " B"
                    Else
                        Return Math.Round(size, 2).ToString & ""
                    End If
                Case Is < 1000000
                    Return Math.Round((size / 1000), 2).ToString & " KB"
                Case Is < 1000000000
                    Return Math.Round((size / 1000000), 2).ToString & " MB"
                Case Is < 1000000000000
                    Return Math.Round((size / 1000000000), 2).ToString & " GB"
                Case Is < 1000000000000000
                    Return Math.Round((size / 1000000000000), 2).ToString & " TB"
                Case Is < 1000000000000000000
                    Return Math.Round((size / 1000000000000000), 2).ToString & " PB"
                Case Else
                    Return ""
            End Select
        End Function

    Aber bei den Ordner bekomme ich dass irgendwie nicht hin 
    Samstag, 2. November 2013 17:29

Antworten

  • Tja, ok ich hatte einen kleinen Fehler im Code, man muss das FileInfo-Objekt natürlich aus dem Dateipfad erstellen und nicht aus dem Ordnerpfad.
    n += New FileInfo(file).Length 'Dateigröße hinzufügen'
    Sonst funktioniert mein Code.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Tobpy Sonntag, 3. November 2013 14:57
    Sonntag, 3. November 2013 14:38
    Moderator

Alle Antworten

  • Hallo,
    mal davon abgesehen, das Zeilen wie

     TextBox2.Text = (Integer.Parse(TextBox2.Text) + 1).ToString()

    sinnlose Leistungsfresser sind [1], geht es bei Ordnern nicht viel anders.

    Gehe einfach die Dateien im Ordner durch und ggf. Unterordner. Dann ermittelst du die Größe aller gesammelten Dateien und summierst die Werte. Zum Auslisten der Dateien im Ordner, kannst du dir das hier ansehen. Zum Auflisten der Ordner gucke mal hier.

    Man könnte das ganze auch noch ander, rekursiv gestalten. Hier ein ungetestetes Beispiel:

        ''' <summary>'
        ''' Ermittelt die Größe der Dateien im Ordner'
        ''' </summary>'
        ''' <param name="path">Der Pfad der Ordner.</param>'
        ''' <param name="subFolder">Gibt an, ob Unterordner berücksichtigt werden sollen.</param>'
        Function GetFileSizesOfFolder(path As String, subFolder As Boolean) As Long
            Dim n As Long = 0
            For Each file In Directory.GetFiles(path) 'Alle Dateien durch gehen'
                n += New FileInfo(path).Length 'Dateigröße hinzufügen'
            Next
            If subFolder Then
                For Each folder In Directory.GetDirectories(path) 'Alle Ordner durch gehen'
                    n += GetFileSizesOfFolder(folder, subFolder) 'Größe der Unterordner-Dateien dazu addieren'
                Next
            End If
            Return n
        End Function

    [1] Wenn du das ändern möchtest, dann speichere die Daten als Zahl (Long) ab und parse den Wert nicht jedesmal aus einem String.

    PS: Deine roundandreturnfilesize-Methode arbeitet nicht ganz richtig, da bei Bytes 1024 die Umrechnungszahl ist, nicht 1000. Also 1024, 1048576, 1073741824, ...


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Samstag, 2. November 2013 17:52
    Moderator
  • Und wie benutze ich dass dann.

    Habe es hier mit versucht klappt aber net

     .SubItems.Add(roundandreturnfilesize(GetFileSizesOfFolder(folder, True)))

    Sonntag, 3. November 2013 12:52
    1. Mein Code ist ungetestet, es kann also noch ein Fehler drinn sein.
    2. Funktioniert nicht? Ohne Fehler....
    3. usw.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 3. November 2013 13:51
    Moderator
  • Es geht aber überhaupt nicht
    Sonntag, 3. November 2013 14:00
  • Tja, ok ich hatte einen kleinen Fehler im Code, man muss das FileInfo-Objekt natürlich aus dem Dateipfad erstellen und nicht aus dem Ordnerpfad.
    n += New FileInfo(file).Length 'Dateigröße hinzufügen'
    Sonst funktioniert mein Code.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Tobpy Sonntag, 3. November 2013 14:57
    Sonntag, 3. November 2013 14:38
    Moderator