Auslesen eines Ordners nur bestimmter Dateien ab einem bestimmten Datum

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von amdus.

    Auslesen eines Ordners nur bestimmter Dateien ab einem bestimmten Datum

    Hallo,

    ich bin zwar fleißiger Leser hier und habe schon so manche Lösungen hier gefunden, stehe momentan aber vor einer Frage die ich nicht beantwortet finde.

    Ich arbeite mit VB.Net Basic 2015.

    Mein Problem:

    In einem Ordner liegen ca. 30.000 bis 50.000 Dateien, die ich tagesaktuell überprüfen muss ob neue TIF-Dateien hinzugekommen sind. Das löse ich wie folgt:

    VB.NET-Quellcode

    1. foundFiles = My.Computer.FileSystem.FindInFiles(y_pfad, "", True, FileIO.SearchOption.SearchTopLevelOnly, "*.tif")


    Hier werden mir natürlich ALLE Dateien angezeigt und ich muss JEDE Datei einzeln nach Datum mit

    VB.NET-Quellcode

    1. For Each file In foundFiles
    2. dateidatum = My.Computer.FileSystem.GetFileInfo(file).CreationTime
    3. Next


    prüfen und dann das Datum vergleichen.
    Bei 30.000 Dateien ist dies natürlich sehr zeitintensiv.

    Frage:
    Gibt es eine Möglichkeit die foundfiles direkt auf die tatsächliche Menge der gefundenen Dateien zu beschränken? Ich finde einfach keine Lösung dafür. Vielleicht hat ja einer von euch dazu eine Idee.

    Danke schon jetzt für jeden Tipp.
    @amdus Willkommen im Forum. :thumbup:
    Programmiere nicht in VB6 sondern VB.NET.
    Mit dieser Zeile hast Du bereits alle FileInfo-Instanzen im Array:

    VB.NET-Quellcode

    1. Dim fis() As FileInfo = New DirectoryInfo("Path").GetFiles("*.tif", SearchOption.TopDirectoryOnly)
    2. For Each fi In fis
    3. Dim dateidatum = fi.CreationTime
    4. Next
    Klar, das dauert ein paar Sekunden, dürfte aber schneller gehen als Dein 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!
    n einem Ordner liegen ca. 30.000 bis 50.000 Dateien, die ich tagesaktuell überprüfen muss ob neue TIF-Dateien hinzugekommen sind. Das löse ich wie folgt:


    ich würde eine Routine vorschlagen die zb. je Stunde prüft ob etwas neues dazu gekommen ist
    hier zum testen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. 'z.b. alle Text Dateien
    3. Dim di As New IO.DirectoryInfo("E:\Testfolder")
    4. ListBox1.DataSource = (From fi As IO.FileInfo In di.GetFiles() _
    5. Where fi.Extension Like ".txt" And fi.CreationTime > Now.AddHours(-1) _
    6. Order By fi.LastAccessTime).ToList
    7. 'nicht älter als 1 std.
    8. ListBox1.DisplayMember = "Name"
    9. End Sub
    Das geht doch mit nem FileSystemWatcher wesentlich eleganter:
    docs.microsoft.com/de-de/dotne…mwatcher?view=netcore-3.1
    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!
    @RodFromGermany

    VB.NET-Quellcode

    1. FileSystemWatcher


    bin vom dem Teil nicht so überzeugt, habe noch kein stabiles gesehen das mit allen Windows Versionen
    funktioniert.

    aber vielleicht eine Option für amdus
    hier eine einfache Variante mit console

    VB.NET-Quellcode

    1. Imports System.IO
    2. Module Module1
    3. Private fsw As FileSystemWatcher
    4. Private path As String = "E:\TestFolder"
    5. Sub Main()
    6. fsw = New FileSystemWatcher(path)
    7. AddHandler fsw.Created, AddressOf fsw_Changed
    8. fsw.EnableRaisingEvents = True
    9. Console.ReadKey()
    10. End Sub
    11. Private Sub fsw_Changed(ByVal sender As Object, ByVal e As FileSystemEventArgs)
    12. Dim file = e.Name
    13. Dim cFileadded = e.ChangeType
    14. Console.WriteLine("neue Datei : " & file)
    15. End Sub
    16. End Module
    @Kasi Ich nutze einen bei längeren Downloads, um den Rechner runterzufahren, hat bisher immer funktioniert.
    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!