Dateisystem protokollieren - nach Systemneustart fortfahren

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von DerDomi.

    Dateisystem protokollieren - nach Systemneustart fortfahren

    Hallo Leute,
    ich habe ein mehr oder weniger spezifisches Problem und finde daher auch keine passenden Ergebnisse im Internet :(

    Ich arbeite an einem Programm, welches mein Dateisystem aufzeichnet. Da meine Festplatte jedoch 1TB Speicherkapazität hat dauert dies dementsprechend lange. Wenn ich jedoch meinen Computer nach einer Weile ausschalte und mein Programm noch nicht fertig ist, muss es beim nächsten Programmstart logischerweise von vorne anfangen...
    Meine Frage ist also: Wie setzte ich die Aufzeichnung des Dateisystems an der Stelle fort, an der das Programm beendet wurde?

    Die Funktion die ich verwende, ruft sich immer wieder selbst auf und die Ordnernamen befinden sich im Array "AlleOrdner()". Meine Überlegung war dieses Array in eine Datei zwischenzuspeichern und beim erneuten Programmstart einzulesen. Ich verstehe leider nicht wie genau ich das realisieren kann.

    VB.NET-Quellcode

    1. Private Sub SucheSubOrdner(ByVal Pfad As Object, Optional ByVal Stammordner_Listed As Object = False)
    2. Static temp_Dateien As New TextBox
    3. If Stammordner_Listed = Nothing Or Stammordner_Listed = False Then
    4. Dim Dateien() As String
    5. Try
    6. If Pfad.EndsWith("") = False Then Pfad = Pfad & ""
    7. temp_Dateien.Text = "[" & Pfad & "]" & vbCrLf
    8. Dateien = Directory.GetFiles(Pfad, "*.*", SearchOption.TopDirectoryOnly)
    9. If Dateien.Length = 0 Then Dateien = New String() {"Leeres Verzeichnis"}
    10. Catch ex As Exception
    11. Dateien = New String() {"Zugriff verweigert!"}
    12. End Try
    13. If Dateien(0) <> "Zugriff verweigert!" And Dateien(0) <> "Leeres Verzeichnis" Then
    14. Dim FI As FileInfo
    15. For i2 As Integer = 0 To Dateien.Length - 1
    16. FI = New FileInfo(Dateien(i2))
    17. temp_Dateien.Text = temp_Dateien.Text & Dateien(i2) & " - (" & FI.CreationTime & ", " & FI.Length & "KB)" & vbCrLf
    18. Next
    19. temp_Dateien.Text = temp_Dateien.Text & vbCrLf
    20. End If
    21. Stammordner_Listed = True
    22. End If
    23. '###---###
    24. Dim AlleOrdner() As String
    25. Try
    26. AlleOrdner = Directory.GetDirectories(Pfad)
    27. Catch ex As Exception
    28. AlleOrdner = New String() {"Zugriff verweigert!"}
    29. End Try
    30. For i As Integer = 0 To AlleOrdner.Length - 1
    31. Threading.Thread.Sleep(30)
    32. If AlleOrdner(i) <> Pfad Then
    33. If AlleOrdner(i) <> "Zugriff verweigert!" Then
    34. Dim Dateien() As String
    35. Try
    36. temp_Dateien.Text = temp_Dateien.Text & "[" & AlleOrdner(i) & "]" & vbCrLf
    37. Dateien = Directory.GetFiles(AlleOrdner(i), "*.*", SearchOption.TopDirectoryOnly)
    38. If Dateien.Length = 0 Then Dateien = New String() {"Leeres Verzeichnis"}
    39. Catch ex As Exception
    40. Dateien = New String() {"Zugriff verweigert!"}
    41. End Try
    42. If Dateien(0) <> "Zugriff verweigert!" And Dateien(0) <> "Leeres Verzeichnis" Then
    43. Dim FI As FileInfo
    44. For i2 As Integer = 0 To Dateien.Length - 1
    45. Try
    46. FI = New FileInfo(Dateien(i2))
    47. temp_Dateien.Text = temp_Dateien.Text & Dateien(i2) & " - (" & FI.CreationTime & ", " & FI.Length & "KB)" & vbCrLf
    48. Catch ex As Exception
    49. temp_Dateien.Text = temp_Dateien.Text & Dateien(i2) & " - (" & ex.Message & ")" & vbCrLf
    50. End Try
    51. Next
    52. temp_Dateien.Text = Maskiere(temp_Dateien.Text & vbcrlf)
    53. 'temp_Dateien speichern
    54. temp_Dateien.Text = ""
    55. End If
    56. End If
    57. End If
    58. Call SucheAlleOrdner(AlleOrdner(i), True)
    59. End If
    60. Next i
    61. End Sub


    PS: es handelt sich um eine Konsolenanwendung!

    Vielen dank im vorraus!
    DerDomi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DerDomi“ () aus folgendem Grund: Copy&Paste Fehler

    Willkommen im Forum. :thumbup:
    Definiere

    DerDomi schrieb:

    welches mein Dateisystem aufzeichnet.
    Was soll dieser Befehl machen?:

    DerDomi schrieb:

    If Pfad.EndsWith("") = False Then Pfad = Pfad & ""
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    In meinem Code hat es beim Copy&Paste die Backslashes verschluckt -.-
    Der Code lautet original:

    VB.NET-Quellcode

    1. If Pfad.EndsWith("*Backslash*") = False Then Pfad = Pfad & "*Backslash*"


    Also zur genaueren Erläuterung: Die Sub gibt mir das gesamte Dateisystem (hier C:\) wie folgt aus:

    HTML-Quellcode

    1. [C:\]
    2. C:\bootmgr - (26.07.2012 10:18:43, 398156B)
    3. C:\BOOTNXT - (26.07.2012 10:18:43, 1B)
    4. C:\BOOTSECT.BAK - (19.01.2013 12:14:29, 8192B)
    5. usw...


    Das Funktioniert auch ohne Probleme nur finde ich keine Möglichkeit, dass das Programm beim nächsten Start weis in welchem Unterordner es weiterarbeiten soll.

    Danke für die Hilfe!

    //EDIT: Ich kann kein Backslash als Visual Basic Code schreiben

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerDomi“ ()

    Wie ich das so sehe, willst Du den Inhalt Deiner Festplatte auflisten.
    Dann tue es.
    Fang an, Die die Vorteile von .NET zu nutzen, sieh Dir mal das an:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim ll() = New IO.DirectoryInfo("c:\Temp").GetFiles("*.*", IO.SearchOption.AllDirectories)
    3. Dim ss As New List(Of String)
    4. For Each l In ll
    5. ss.Add(l.FullName)
    6. Next
    7. IO.File.WriteAllLines("c:\temp\xxx.txt", ss.ToArray)
    8. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab mit deinem Codeausschnitt etwas rumprobiert. Dabei komme ich leider zu einem Problem, weshalb ich ihn nicht verwenden kann :(

    HTML-Quellcode

    1. "System.UnauthorizedAccessException"
    2. bei Zugriff auf: "C:\$Recycle.Bin\S-1-5-18"
    3. in der Zeile: Dim ll() = New IO.DirectoryInfo("C:").GetFiles("*.*", IO.SearchOption.AllDirectories)


    Soweit ich weis, kann ich mit Try-Catch keine einzelnen Ergebnisse catchen, da sonst das ganze "ll"-Array unbrauchbar wird oder sehe ich das falsch?
    Wohl wissend hab ich nicht "C:\" reingeschrieben. ;)
    Du kannst natürlich eins höher gehen und jedes Root-Verzeichnis einzeln mit Try / Catch abtesten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich muss doch jedes Verzeichnis catchen können... während ich bspw. auf "C:\Users\MeinBenutzer" Zugriff habe, habe ich keinen auf "C:\Users\Administrator". Deshalb kann ich leider nicht einfach "SearchOption.AllDirectories" benutzen aber danke für die Idee! Für Tipps und Anregungen steh ich natürlich offen ^^
    Meiner Meinung nach hat Rod genau das vorgeschlagen, was du wolltest.

    RodFromGermany schrieb:

    Du kannst natürlich eins höher gehen und jedes Root-Verzeichnis einzeln mit Try / Catch abtesten.


    Du gehst in der Schleife alle Unterverzeichnisse durch und auf die, die du Zugriff hast, kriegst du eben keine Exception und kannst damit weiter arbeiten.
    @DerDomi:: Nach einem einzigen Testlauf solltest Du wissen, wo es knallt und wo nicht.
    Dann noch ein test auf einem fremden Rechner und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich glaube ich verstehe euch alle falsch -.- Ich hab jetzt folgendes zusammen geschrieben und steh auf dem Schlauch.

    VB.NET-Quellcode

    1. Dim ll() = New IO.DirectoryInfo("c:").GetDirectories()
    2. Dim ss As New List(Of String)
    3. While ll.Length > 0
    4. For Each l In ll
    5. ss.Add(l.FullName)
    6. Try
    7. ll = New IO.DirectoryInfo(l.FullName).GetDirectories()
    8. Catch ex As Exception
    9. End Try
    10. Next
    11. End While

    Das Problem bei diesem Code ist, dass es mir nur vom letzten Ergebniss des ersten Durchlaufs die Unterordner anzeigt. (Siehe unten)

    HTML-Quellcode

    1. [...]
    2. c:\System Volume Information
    3. c:\TEMP
    4. c:\Users
    5. c:\Windows
    6. c:\Windows.old
    7. c:\Windows.old\$Recycle.Bin
    8. c:\Windows.old\Documents and Settings
    9. c:\Windows.old\PerfLogs
    10. c:\Windows.old\Users
    11. c:\Windows.old\Users\All Users
    12. c:\Windows.old\Users\Default
    13. c:\Windows.old\Users\Default User
    14. [...]
    Probier mal

    VB.NET-Quellcode

    1. Dim ll() = New IO.DirectoryInfo("c:").GetDirectories()
    2. Dim ss As New List(Of String)
    3. While ll.Length > 0
    4. For Each l In ll
    5. ss.Add(l.FullName)
    6. Try
    7. ll = New IO.DirectoryInfo(l.FullName).GetDirectories("*.*", IO.SearchOption.AllDirectories) ' das hier
    8. Catch ex As Exception
    9. End Try
    10. Next
    11. End While
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du brauchst 2 Schleifen.
    Eine besorgt die Verzeichnisse, die andere die Files darin.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey,

    Schau auch mal hier rein, wenn du deine Ordner mit Unterordner, etc durchsuchen möchtest:

    [VB 2010] Rekursive Dateisuche mit anonymer Methode

    Gruß
    Youtube Info Library 2013 jetzt im Showroom.
    Mit dem folgenden Code gibt es mir erfolgreich den Großteil der Dateien und Ordner aus. Wenn jedoch ein GetDirectories() wegen einem Ordner ohne Zugriffsrechte abgefangen wird, werden die anderen Ordner auf der selben Ebene auch nicht aufgelistet.

    VB.NET-Quellcode

    1. Dim ll() = New IO.DirectoryInfo("c:").GetDirectories()
    2. Dim ss As New List(Of String)
    3. While ll.Length > 0
    4. For Each l In ll
    5. Try
    6. ll = New IO.DirectoryInfo(l.FullName).GetDirectories()
    7. ss.Add("[" & l.FullName & "]")
    8. Dim files() = New IO.DirectoryInfo(l.FullName).GetFiles("*.*", IO.SearchOption.AllDirectories)
    9. For Each File In files
    10. ss.Add(File.FullName)
    11. Next
    12. Catch ex As Exception
    13. End Try
    14. Next
    15. End While

    Ich kann morgen nochmal schauen wie genau ich diesen Fehler beheben kann, falls es schon jemand weis bin ich für hilfe dankbar ;)
    @One-Soft: Danke für den Link den schau ich mir morgen auch mal an!

    Bis dahin, viel Spaß euch allen :D
    Hier bin ich wieder :)
    Der folgende Code funktioniert so weitestgehend:

    VB.NET-Quellcode

    1. Dim ll() = New IO.DirectoryInfo("g:").GetDirectories()
    2. Dim ss As New List(Of String)
    3. While ll.Length > 0
    4. For Each l In ll
    5. Try
    6. ll = New IO.DirectoryInfo(l.FullName).GetDirectories()
    7. For Each l1 In ll
    8. ss.Add("[" & l1.FullName & "]")
    9. Try
    10. Dim files() = New IO.DirectoryInfo(l1.FullName).GetFiles("*.*", IO.SearchOption.AllDirectories)
    11. For Each File In files
    12. ss.Add(File.FullName)
    13. Next
    14. Catch ex As Exception
    15. End Try
    16. Next
    17. Catch ex As Exception
    18. End Try
    19. Next
    20. End While


    Der Link ist auch sehr hilfreich, denn damit habe ich 3 verschiedene Möglichkeiten gefunden meine Festplatte aufzulisten! Deshalb würde ich gerne auf mein Ursprüngliches Problem zurück führen:
    Wie kann ich das Programm meine Festplatte aufzulisten lassen, es beenden und zu einem späteren Zeitpunkt weiterarbeiten lassen? Ich muss ja irgendwie die Werte aus den Arrays die in den Schleifen abgefragt werden, in einer Datei zwischenspeichern oder gibt es andere Möglichkeiten?
    Aufgrund welchen Sachverhalts kann denn eine solche Protokollierung mittendrin aufhören?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn eine Festplatte sehr groß ist, kann es ein bisschen dauern bis komplett alles aufgelistet wurde. Wenn ich den Computer vorher abschalte und das Programm ist sagen wir bei 90% muss es beim nächsten start wieder von vorne anfangen... Allgemein hätte es mich auch interessiert wie man sowas in der Art zwischenspeichern kann
    Dann würde ich doch die Aufgabe aufteilen in die einzelnen Verzeichnisse oder Unterverzeichnisse.
    Da musst Du Dir halt eine geeignete Abbruchbedingung schaffen, z.B. über einen Button ein Abbruchflag setzen und dann merkst Du Dir einfach das letzte vollständig gelistete (Unter-) Verzeichnis und machst da weiter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich komme leider nicht dahinter, wie ich das für beliebig viele Unterverzeichnisse realisieren kann.
    Höchstens mit vielen verschachtelten For-Each-Schleifen aber dann kann ich auch nur so viele Unterverzeichnisse finden, wie ich Schleifen habe. Quasi so:

    VB.NET-Quellcode

    1. Dim DirList As New List(Of String)
    2. Dim rootDir() = New IO.DirectoryInfo("c:").GetDirectories()
    3. For Each rd In rootDir
    4. DirList.Add(rd.FullName)
    5. Try
    6. Dim oDir() = New IO.DirectoryInfo(rd.FullName).GetDirectories()
    7. For Each od In oDir
    8. DirList.Add(od.FullName)
    9. Dim o2Dir() = New IO.DirectoryInfo(od.FullName).GetDirectories()
    10. Next
    11. Catch ex As Exception
    12. End Try
    13. Next