CSV-Dateien nach bestimmte Kriterien durchsuchen und Teile der CSV-Dateien zusammen fassen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Cyber-Cobold.

    CSV-Dateien nach bestimmte Kriterien durchsuchen und Teile der CSV-Dateien zusammen fassen

    Hallo zusammen,
    ich habe folgendes Problem.
    Ich muss mit sehr vielen csv-Dateien arbeiten.
    Die csv-Dateien liegen in einem Ordner.
    In den csv-Dateien sind wiederum sehr viele Informationen abgelegt, die ich aber gar nicht alle benötige.
    z.B.: steht das Datum, Seriennummer und MesswertIndex1, MesswertIndex2,…,Strom,Hysterese usw. alles mögliche steht da drin.
    Ich benötige auch nicht alle csv-Dateien sondern nur die, die eine bestimmet Seriennummer haben.
    Wenn eine csv-Datei solch eine Seriennummer hat benötige ich das Datum, Seriennummer und den Strom.
    In dem Ordner gibt es immer unterschiedlich viele csv-Dateien die, die Gleiche Seriennummer haben.
    Die alle soll ich immer finden und die Werte wie bereits genannt in eine excel zusammenfassen.
    Ich versuche mich da schon eine ganze Weile dran, komme aber nicht weiter.
    Ich habe es gerade mal geschafft, eine csv-Datei zu lesen und in einer Textbox auszugeben.
    Leider habe ich auch nur sehr wenig Erfahrung in vb.net.
    Ich kann auch im Internet nichts finden was mir hilft, es bezieht sich immer alles auf xml Dateien.
    Es wäre echt super, wenn mir jemand helfen könnte.
    Willkommen im Forum.

    Ich geb mal ein paar Stichpunkte:
    • Datei mit IO.File.ReadAllLines einlesen -> Du erhältst ein String-Array
    • wenn die Seriennummer (S/N) immer in einer bestimmten Zeile ist, hol sie Dir mit DeinStringArray(Zeilennummer), dann diese Zeile mit .Split(";"c)* aufspalten und nach Deiner S/N im daraus entstehenden Array suchen
    • wenn die S/N nicht immer an der selben Stelle ist, dann alle Zeilen durchgehen, splitten und nach ihr suchen
    • sobald Du Deine S/N hast, dann die Datei mit den o.g. Methoden nach weiteren relevanten Daten durchforsten
    * vorausgesetzt das Trennzeichen ist ein ;. Ansonsten das passende an der Stelle einsetzen.

    Mach was draus und wenn Du nicht weiterkommst, poste das, was Du geschafft hast.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Cyber-Cobold schrieb:

    In dem Ordner gibt es immer unterschiedlich viele csv-Dateien die, die Gleiche Seriennummer haben.
    Es ist wesentlich einfacher, zu helfen, wenn du dich eindeutig und mit den richtigen Begriffen ausdrückst.
    Weil soweit ich weiss, kann eine Datei keine SerienNummer haben.
    Also was meinst du wirklich damit?

    ErfinderDesRades schrieb:

    Weil soweit ich weiss, kann eine Datei keine SerienNummer haben.


    Cyber-Cobold schrieb:

    z.B.: steht das Datum, Seriennummer und MesswertIndex1, MesswertIndex2,…,Strom,Hysterese usw. alles mögliche steht da drin.


    Bedeutet, die Seriennummer steht in der Datei.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    @ Akanel
    @ErfinderDesRades
    Hallo Akanel, Hallo ErfinderDesRades,
    die CSV-Dateien werden von einer Maschine erzeugt die Geräte prüft.
    In den CSV-Dateien werden dann die Seriennummern der geprüften Geräte abgelegt, damit man die Werde den Geräten wieder zuweisen kann.
    Also die Datei als solches hat keine Seriennummer.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cyber-Cobold“ ()

    @VaporiZed

    Vielen Dank für deine Hilfe.
    Leider komme ich aber nicht sehr weit.
    Ich habe leider ein Problem mit dem FileDialog.
    Wenn ich es "normal" mit Dim Deklariere geht es nicht.
    Wenn ich es mir Using versuche bekomme ich eine Fehlermeldung.
    (Fehler BC30569 'New darf nicht für eine Klasse verwendet werden, die als "MustInherit" deklariert ist.)


    Mein Code sieht bis jetzt so aus:

    VB.NET-Quellcode

    1. Sub Einlesen()
    2. Using fd As New FileDialog 'zum benutzen einer Datei
    3. Using sfd As New SaveFileDialog 'zum Speichern des Ordners
    4. 'Abfragen wo die Ursprungsdatei liegt. Wenn auf Abbruch gedrückt wird, beenden der Routine
    5. If sfd.ShowDialog = DialogResult.Cancel Then Return
    6. 'Using ral As New IO.File.readalllines(ofd.FileName)
    7. Dim ral As Array
    8. ral = IO.File.ReadAllLines(fd.FileName)
    9. Using sw As New IO.StreamWriter(sfd.FileName)
    10. 'CSV-Datei einlesen bis am Ende angekommen
    11. Dim line = ral(4).Split(";"c)
    12. sw.WriteLine("Seriennummer;" & line(0))
    13. End Using
    14. End Using
    15. End Using
    16. End Sub
    Fehlermeldung immer mit der Zeile angeben, wo der Fehler und ggf. für welchen Teil er auftritt
    Ok, guter Anfang. Du brauchst keinen FileDialog, weil der abstrakt ist. Du brauchst einen OpenFileDialog (ofd). Den musst Du anzeigen lassen (auch ShowDialog) und dessen FileName bei ReadAllLines verwenden.
    Zeile#7: Array ist obsolet. Schreib nur Dim ral = IO.File.ReadAllLines(ofd.FileName) (was bedeutet ral?)
    Das mit den verschiedenen Dialogen ist etwas kompliziert gelöst. Aber setz erstmal das o.g. um und schau, ob es dann geht und ich bastel danach etwas einfacheres zusammen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    hast du es mit Powershell versucht

    hier ein Script ein Verzeichnis nach .csv zu filteren und eine Suche mit suchtext (in dem fall AF2134)
    das suchergebnis liefert dir:
    die Datei (Path)
    in welcher Zeile (LineNumber)
    die Zeile selbst (Line)

    VB.NET-Quellcode

    1. Get-ChildItem -Path "E:\Berichte" -Filter "*.csv" -recurse |
    2. Select-String -pattern "AF2134" |
    3. Select-Object -Property Path,LineNumber,Line |
    4. Export-CSV "E:\Check\ResultFile.csv" -Delimiter ';' -NoTypeInformation -Encoding UTF8


    hier Bild der "E:\Check\ResultFile.csv"


    keine Ahnung ob du aber nur mit .Net eine Lösung suchst

    gruss
    Kasi
    Hi VaporiZed,
    also ich bin ein gutes stück weiter gekommen. 8o
    Ich kann jetzt aus einer CSV-Datei die zwei Werte, die ich möchte auslesen und in eine neue CSV-Datei schreiben.
    Der Code sieht so aus.

    VB.NET-Quellcode

    1. ​Sub Einlesen()
    2. Using ofd As New OpenFileDialog 'zum benutzen einer Datei
    3. Using sfd As New SaveFileDialog 'zum Speichern des Ordners
    4. If ofd.ShowDialog = DialogResult.Cancel Then Return 'Abfragen wo die neue Datei liegt. Wenn auf Abbruch gedrückt wird, beenden der Routine
    5. If sfd.ShowDialog = DialogResult.Cancel Then Return 'Abfragen wo die Ursprungsdatei liegt. Wenn auf Abbruch gedrückt wird, beenden der Routine
    6. 'CSV-Datei einlesen bis zum Ende
    7. Dim ral1 = IO.File.ReadAllLines(ofd.FileName)
    8. Dim ral2 = IO.File.ReadAllLines(ofd.FileName)
    9. Using sw As New IO.StreamWriter(sfd.FileName)
    10. 'Gezielt Werte auslesen
    11. Dim line1 = ral1(3).Split(";"c)
    12. Dim line2 = ral2.Last.Split(";"c)
    13. sw.WriteLine("Seriennummer;" & line1(1) & ";" & " Ipn [mA] ;" & line2(5) & vbCrLf)
    14. End Using
    15. End Using
    16. End Using
    17. End Sub


    Jetzt fehlen mir nur noch zwei Bedingungen.
    Die erste ist, dass mir das Programm alle CSV-Dateien die in einem Ordner stehen auslesen soll.
    Ich bräuchte dann nur noch einmal den Ordner angeben und müsste nicht jede Datei einzeln öffnen.
    Und die Ausgelesenen Werte sollten natürlich in der neuen Datei untereinander stehen.
    Ich habe es mal versucht, scheitere aber total.
    Da fehlt mir ehrlich gesagt schon der Ansatz.
    Ich habe mir gedacht, das ev. mit der Eigenschaft Firstline <> "" then Line+1.
    Aber das ist totaler Müll.
    Ja, sieht doch schon mal brauchbar aus. Hier eine Möglichkeit, dass der Code ggf. etwas einfacher wird:

    VB.NET-Quellcode

    1. Sub Einlesen()
    2. Dim PathOfFileToAnalyze = String.Empty
    3. Using ofd As New OpenFileDialog
    4. If ofd.ShowDialog = DialogResult.Cancel Then Return
    5. PathOfFileToAnalyze = ofd.FileName
    6. End Using
    7. Dim PathOfTargetFile = String.Empty
    8. Using sfd As New SaveFileDialog
    9. If sfd.ShowDialog = DialogResult.Cancel Then Return
    10. PathOfTargetFile = sfd.FileName
    11. End Using
    12. Dim FileLinesToAnalyze = IO.File.ReadAllLines(PathOfFileToAnalyze)
    13. Dim SerialNumber = FileLinesToAnalyze(3).Split(";"c)(3)
    14. Dim ElectricCurrentInmA = FileLinesToAnalyze.Last.Split(";"c)(5)
    15. IO.File.AppendAllLines(PathOfTargetFile, {$"Seriennummer: {SerialNumber}; Ipn [mA]: {ElectricCurrentInmA}"})
    16. End Sub


    nun zum Thema alle Dateien auf einmal:
    Dafür verwendest Du z.B. den FolderBrowserDialog oder - wenn ein zusätzlicher DLL-Import i.O. ist - den CommonOpenFileDialog. Damit bekommst Du als FileName ein Verzeichnis, mit dem Du mit New IO.DirectoryInfo(FileName) und GetFiles alle Dateien in ein FileInfo-Array bekommst. Jede FileInfo kannst Du dann mit deren FullName in einer Schleife durchgehen. Das erspart Dir den OpenFileDialog.
    Um zum Endergebnis zu kommen, daher diese Reihenfolge:
    • Verzeichnis wählen (wie beschrieben)
    • Zieldatei wählen (wie bisher)
    • alle Dateien in einer Schleife analysieren (fast so, wie Du es bisher mit der einen gemacht hast)
    • die Daten nicht gleich in die Zieldatei schreiben, sondern in einer List(Of String) sammeln
    • nachdem alle Dateien anaylsiert wurden, die genannte List(Of String) in die Zieldatei schreiben (IO.File.WriteAllLines nutzen und die List an der Stelle in den Parametertyp umwandeln, den die Funktion akzeptiert - ein StringArray)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Schreib die ausgelesenen Zeilen nicht in einen String, sondern nimm dafür den StringBuilder und füge ihm mit .AddNewLine() eine neue Zeile hinzu.

    Dateien in Ordner durchlaufen ist das Stichwort für Dich IO.DirectoryInfo.

    Zusätzlich würde ich noch statt IO.File.ReadAllLines lieber einen StreamReader verwenden, da der die Datei nicht sperrt und womöglich ein abschließendes Löschen der Datei mit einer Exception verhindert.
    @VaporiZed

    Meine VB Kenntnisse sind doch sehr begrenzt. :/
    Ich beiße mir die Zähne gerade an deiner Info aus.
    ​nun zum Thema alle Dateien auf einmal:Dafür verwendest Du z.B. den FolderBrowserDialog oder - wenn ein zusätzlicher DLL-Import i.O. ist - den CommonOpenFileDialog. Damit bekommst Du als FileName ein Verzeichnis, mit dem Du mit New IO.DirectoryInfo(FileName) und GetFiles alle Dateien in ein FileInfo-Array bekommst. Jede FileInfo kannst Du dann mit deren FullName in einer Schleife durchgehen. Das erspart Dir den OpenFileDialog.Um zum Endergebnis zu kommen, daher diese Reihenfolge:


    Ich komme da nicht weiter.
    Es hagelt bei mir nur noch so die Fehlermeldungen.
    Ich mache da grundlegend etwas falsch.
    Könntest du mir da noch mal etwas unterstützen?

    VB.NET-Quellcode

    1. Sub alles_Einlesen()
    2. Using fbd As New FolderBrowserDialog 'zum benutzen eines Ordners
    3. Using sfd As New SaveFileDialog 'zum Speichern des Ordners
    4. If fbd.ShowDialog = DialogResult.Cancel Then Return 'Abfragen wo die neue Datei liegt. Wenn auf Abbruch gedrückt wird, beenden der Routine
    5. If sfd.ShowDialog = DialogResult.Cancel Then Return 'Abfragen wo die Ursprungsdatei liegt. Wenn auf Abbruch gedrückt wird, beenden der Routine
    6. Using dinfo As New IO.DirectoryInfo(fbd.filname)
    7. 'CSV-Datei einlesen bis zum Ende
    8. 'Dim ral1 = IO.DirectoryInfo.getfils(filename)
    9. 'Dim ral2 = IO.File.ReadAllLines(fbd.FileName)
    10. Using sw As New IO.StreamWriter(sfd.FileName)
    11. 'Gezielt Werte auslesen
    12. 'Dim line1 = ral1(3).Split(";"c)
    13. 'Dim line2 = ral2.Last.Split(";"c)
    14. 'sw.WriteLine("Seriennummer;" & line1(1) & ";" & " Ipn [mA] ;" & line2(5) & vbCrLf)
    15. End Using
    16. End Using
    17. End Using
    18. End Using
    19. End Sub

    Zeile 8 (Using dinfo...) wird gar nicht erkannt. :S
    Ich habe schon im Internet nach dem FolderBrowsDialog für VB.net gesucht.
    Leider aber nichts gefunden.
    @Cyber-Cobold Du brauchst einen SaveFileDialog, nicht aber einen FolderBrowserDialog.
    Entferne diesen restlos aus diesem Code.
    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!
    @VaporiZed

    ich bin doch noch fündig geworden

    VB.NET-Quellcode

    1. Sub alles_Einlesen()
    2. Dim FolderBrows As FolderBrowserDialog = New FolderBrowserDialog 'Verstehe ich nicht
    3. FolderBrows.ShowDialog()
    4. Using sfd As New SaveFileDialog 'zum Speichern des Ordners
    5. If FolderBrows.ShowDialog() = DialogResult.Cancel Then Return 'Abfragen wo die neue Datei liegt. Wenn auf Abbruch gedrückt wird, beenden der Routine
    6. If sfd.ShowDialog = DialogResult.Cancel Then Return 'Abfragen wo die Ursprungsdatei liegt. Wenn auf Abbruch gedrückt wird, beenden der Routine
    7. Using sw As New IO.StreamWriter(sfd.FileName)
    8. 'Gezielt Werte auslesen
    9. 'Dim line1 = ral1(3).Split(";"c)
    10. 'Dim line2 = ral2.Last.Split(";"c)
    11. 'sw.WriteLine("Seriennummer;" & line1(1) & ";" & " Ipn [mA] ;" & line2(5) & vbCrLf)
    12. End Using
    13. End Using
    14. End Sub

    Cyber-Cobold schrieb:

    VB.NET-Quellcode

    1. Dim FolderBrows As FolderBrowserDialog = New FolderBrowserDialog 'Verstehe ich nicht
    Lösch das und alle Verweise auf FolderBrows :!:
    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!
    Hi,

    meiner Meinung nach solltest du nicht nur die Spalten die du brauchst in die neue Datei
    schreiben sondern auch aus welcher Datei diese Daten stammen

    überlage mal du schreibst aus 300 CSV-Dateien die Messwerte, Datum etc....
    und schreibst daraus eine neue Datei mit 1000 Zeilen, und jemand will wissen .. he in der Zeile
    344 is ein übler Messwert... was dann ? dann geht die Rückverfolgung los, aus welcher Datei kam jetzt
    diese Zeile.
    das ist meine Befürchtung , abe du musst Wissen ob es notwendig ist oder nicht.

    hier noch ein wenig Code, vielleicht hilft es

    VB.NET-Quellcode

    1. Private Sub Button9_Click(sender As System.Object, e As System.EventArgs) Handles Button9.Click
    2. Dim Files() As String = Directory.GetFiles("E:\CSVDateien", "*.csv", IO.SearchOption.AllDirectories)
    3. Dim Spalte() As String
    4. Using Writer As New System.IO.StreamWriter("E:\Check\Ergebnis.txt") 'schreibe Datei und Zeilen Text
    5. For Each file As String In Files
    6. Dim sr As New StreamReader(file)
    7. While Not sr.EndOfStream
    8. Dim line As String = sr.ReadLine()
    9. Spalte = Split(line, ";")
    10. If Spalte.Contains("Chai") Then
    11. 'schreibe Datei und Zeile
    12. Writer.WriteLine("in Datei(" & file & ")" & line)
    13. 'oder die Spalten die du brauchst
    14. 'Writer.WriteLine(Spalte(2) & "-" & Spalte(1))
    15. End If
    16. End While
    17. Next file
    18. End Using
    19. End Sub


    Ergebis in Textdatei

    VB.NET-Quellcode

    1. in Datei(E:\CSVDateien\Article1.csv)Chai;10 boxes x 20 bags;185;39;False
    2. in Datei(E:\CSVDateien\Article2.csv)Chai;12 - 200 ml jars;311;31;False
    3. in Datei(E:\CSVDateien\Article3.csv)Chai;24 pkgs. x 4 pieces;1001;3;False


    gruss
    kasi
    So. Dann geb ich mal wieder meinen Senf dazu.
    @Cyber-Cobold: Ein wenig zuviel Using ;)
    Ob Du jetzt nen FolderBrowserDialog nimmst oder den Pfad fix festlegst, bleibt Dir überlassen. Hier die Varianten, wie ich es (vor einem Refactoring*) gemacht hätte:

    VB.NET-Quellcode

    1. Sub Einlesen()
    2. Dim PathOfTargetFile = String.Empty
    3. Using Sfd As New SaveFileDialog
    4. If Sfd.ShowDialog = DialogResult.Cancel Then Return
    5. PathOfTargetFile = Sfd.FileName
    6. End Using
    7. Dim FinalDataList As New List(Of String)
    8. For Each CsvFile In New IO.DirectoryInfo("HierDeinenFixenCsvVerzeichnispfadEintragen").GetFiles("*.csv")
    9. Dim FileLinesToAnalyze = IO.File.ReadAllLines(CsvFile.FullName)
    10. Dim SerialNumber = FileLinesToAnalyze(3).Split(";"c)(3)
    11. Dim ElectricCurrentInmA = FileLinesToAnalyze.Last.Split(";"c)(5)
    12. FinalDataList.Add($"Seriennummer: {SerialNumber}; Ipn [mA]: {ElectricCurrentInmA}")
    13. Next
    14. IO.File.WriteAllLines(PathOfTargetFile, FinalDataList.ToArray)
    15. End Sub

    VB.NET-Quellcode

    1. Sub Einlesen()
    2. Dim PathOfDirectoryToAnalyze = String.Empty
    3. Using Fbd As New FolderBrowserDialog
    4. If Fbd.ShowDialog = DialogResult.Cancel Then Return
    5. PathOfDirectoryToAnalyze = Fbd.SelectedPath
    6. End Using
    7. Dim PathOfTargetFile = String.Empty
    8. Using Sfd As New SaveFileDialog
    9. If Sfd.ShowDialog = DialogResult.Cancel Then Return
    10. PathOfTargetFile = Sfd.FileName
    11. End Using
    12. Dim FinalDataList As New List(Of String)
    13. For Each CsvFile In New IO.DirectoryInfo(PathOfDirectoryToAnalyze).GetFiles("*.csv")
    14. Dim FileLinesToAnalyze = IO.File.ReadAllLines(CsvFile.FullName)
    15. Dim SerialNumber = FileLinesToAnalyze(3).Split(";"c)(3)
    16. Dim ElectricCurrentInmA = FileLinesToAnalyze.Last.Split(";"c)(5)
    17. FinalDataList.Add($"Seriennummer: {SerialNumber}; Ipn [mA]: {ElectricCurrentInmA}")
    18. Next
    19. IO.File.WriteAllLines(PathOfTargetFile, FinalDataList.ToArray)
    20. End Sub

    VB.NET-Quellcode

    1. Sub Einlesen()
    2. Dim PathOfDirectoryToAnalyze = String.Empty
    3. Using Fbd As New Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog
    4. Fbd.IsFolderPicker = True
    5. If Fbd.ShowDialog = DialogResult.Cancel Then Return
    6. PathOfDirectoryToAnalyze = Fbd.FileName
    7. End Using
    8. Dim PathOfTargetFile = String.Empty
    9. Using Sfd As New SaveFileDialog
    10. If Sfd.ShowDialog = DialogResult.Cancel Then Return
    11. PathOfTargetFile = Sfd.FileName
    12. End Using
    13. Dim FinalDataList As New List(Of String)
    14. For Each CsvFile In New IO.DirectoryInfo(PathOfDirectoryToAnalyze).GetFiles("*.csv")
    15. Dim FileLinesToAnalyze = IO.File.ReadAllLines(CsvFile.FullName)
    16. Dim SerialNumber = FileLinesToAnalyze(3).Split(";"c)(3)
    17. Dim ElectricCurrentInmA = FileLinesToAnalyze.Last.Split(";"c)(5)
    18. FinalDataList.Add($"Seriennummer: {SerialNumber}; Ipn [mA]: {ElectricCurrentInmA}")
    19. Next
    20. IO.File.WriteAllLines(PathOfTargetFile, FinalDataList.ToArray)
    21. End Sub



    * das ist wieder ein anderes Thema ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank Euch allen für Eure Unterstützung, das macht echt spaß so und man lernt viel.

    @Kasi

    Kasi schrieb:

    überlage mal du schreibst aus 300 CSV-Dateien die Messwerte, Datum etc....
    und schreibst daraus eine neue Datei mit 1000 Zeilen, und jemand will wissen .. he in der Zeile
    344 ist ein übler Messwert... was dann ? dann geht die Rückverfolgung los, aus welcher Datei kam jetzt
    diese Zeile.
    das ist meine Befürchtung , aber du musst Wissen ob es notwendig ist oder nicht.


    Danke für deine Hilfe.
    Da hast du auf jeden Fall recht.

    @VaporiZed
    Dein Code ist auf jeden Fall übersichtlicher und aufgeräumter als meiner. :)
    Den werde ich heute mal noch testen, aber ohne fixen Pfad.

    Sollte man nicht so viel Using in einem Programm verwenden?
    Ich dachte das ist clever, da das Objekt beim verlassen ja geleert wird. :whistling:
    Using kannst Du nur verwenden, wenn ein Objekt die IDisposable-Schnittstelle implementiert, v.a. daran zu sehen, dass es .Dispose als Methode anbietet*. Die Verwendung des Using-Blocks ist dafür da, damit man
    1. weiß, dass dieses Objekt offensichtlich mit Dingen hantiert, die unaufgeräumt auf Dauer zu sinnloser Speicherbelegung (memory leaks) führen, um die sich das System, will konkret heißen: der Garbage Collector nicht automatisch kümmern kann
    2. nicht selber an den Aufruf der Dispose-Methode denken muss
    Da aber eine DirectoryInfo nicht mit sowas hantiert, will heißen, diese Schnittstelle nicht implementiert, kannst Du dafür auch kein Using verwenden.

    * per Konvention heißt die so, eine Klasse kann aber auch entscheiden, dass sie anders heißt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.