none
VB2010: FindFirstFile/FindNextFile

    Allgemeine Diskussion

  • Hallo,

    ich brauche etwas Hilfe von Euch um auch Dateien erfassen zu können bei denen normalerweise dann die PathTooLong Exeption auftritt.

    Nach verschiedenen Suchen dürfte die Lösung darin liegen FindFirstFile und FindNextFile aus der kernel32.dll zu verwenden, das dann als Unicode.

    Nur habe ich mittlerweile soviele verschiedene Beispiele gefunden, das ich nicht mehr sicher bin was den nun funktioniert.

    Wichtig ist mir dass das auslesen aller Dateien nicht auf die Nase fällt, möchte die gefundenen Dateien mit Pfad und Dateiname in eine Textdatei speichern.

    Wäre es möglich von Euch den korrekten Code zur Verwendung der API zu bekommen? Ich bin mir auf Grund der vielen unterschiedlichen Treffer nicht sicher, schon bei  WIN32_FIND_DATA gibt es unterschiedliche Angaben.

    Würde mich sehr über Eure Hilfe freuen...

    Viele Grüsse,
    Maxi

    Samstag, 8. Oktober 2011 22:16

Alle Antworten

  • Hallo MaxiTesch,

    Kannst Du bitte Dein Problem deutlicher und völlig beschreiben?

    Umfasse mindestens die folgenden Schritte in der Beschreibung Deines Problems:

    1) Eine Übersicht der Funktionsweise von dem Programm

    2) Das Ergebnis des aktuellen Codes

    3) Was erwartest Du dass Dein Code machen soll

    4) Den Inhalt der Eingabedateien (falls zutreffend)

    *************************************************

    Schau Dir mal den folgenden Link an. Vielleicht kann er Dir weiterhelfen:

    List files in directory in VB (VBListFilesInDirectory)

    *************************************************

    Danke und Grüße,

    Robert

    Dienstag, 11. Oktober 2011 16:45
    Besitzer
  • Hallo Maxitech,

    Win API? NEIN. Das geht mit NET Klassen. Dieser code findet den neuesten File. Vielleicht hilft Dir der.

    Option Strict On
    Option Explicit On
    Option Infer Off
    Imports System.IO
    Imports System.Environment
    
    
    'Try it like this with one Button on a Form please.
    'This shows the most recent jpg file in the MyPictures folder
    
    
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim fileList As New List(Of FileInfo)
            Dim myPath As String = My.Computer.FileSystem.SpecialDirectories.MyPictures & "\"
            fileList.AddRange(New DirectoryInfo(myPath).GetFiles("*.jpg"))
    
            Dim newestFiles As System.Collections.Generic.IEnumerable(Of FileInfo) = From file In fileList Order By File.CreationTime Descending Take 1
    
            Dim fileInfoList As List(Of FileInfo) = newestFiles.ToList
    
            If fileInfoList.Count > 0 Then
                MessageBox.Show("File date = " & fileInfoList.Item(0).CreationTime.ToLongDateString & NewLine & NewLine & " filename = " & fileInfoList.Item(0).Name)
            End If
    
        End Sub
    End Class
    
    

    Die files befinden sich geordnet nach creation time in der Liste fileInfoList.

    Nachtrag: Lasse die Anweisung Take 1 weg. Dann bekommst Du alle files. Schreiben in eine Textdatei geht dann so:

           Dim sw As New StreamWriter("Test.txt")
            For Each file As FileInfo In fileInfoList
                Dim name As String = file.FullName
                sw.WriteLine(name)
            Next
            sw.Close()

     

    Gruss Ellen
     


    Ich benutze/ I'm using VB2008 & VB2010
    • Bearbeitet Ellen Ramcke Samstag, 15. Oktober 2011 16:25 Nachtrag
    Samstag, 15. Oktober 2011 16:06
  • Hallo Robert,

    danke für Deine Antwort und entschuldige bitte die späte Reaktion. Ich habe verschiedene Projekte am laufen und der FileScan ist erst zweite Prio, aber für mich genau so wichtig.

    Vorab eine erste Info weshalb ich mit API suchen muss:
    Auf einem FileServer befinden sich einige tausend Files, die durch unsere User auf den Server kopiert wurden. Durch umbenennen der Files oder Folder ist die Länge stets angewachsen und liegt nun über den 256 Zeichen (bzw > 259 Zeichen) und erzeugt beim ansprechen durch Funktionen des Framework eben eine Path too long-Exeption.

    Arbeitsweise/Sinn des Programm:
    Es sollen alle Files einer bestimmten Extension gesucht und untersucht werden. Dazu werden verschiedene Informationen aus dem File gelesen und auf einem SQL-Server abgelegt um diese dann gemäss verschiedenen Anforderungen auszuwerten. Damit ich an die Infos komme, muss ich die Files suchen, öffnen, Inhalt auslesen und wieder schliessen. Beim Zugriff auf die Files generiert mir das Framework den obigen Fehler (Path too long).

    Ergebnis des aktuellen Code von mir ist der Fehler und ich bin wieder zurück zum Anfang und starte das Projekt nochmal neu. Um das zu machen, möchte ich erst die grundlegende Funktion verwirklichen, das auslesen via API kernel32.dll und der Funktionen FindFirstFile und FindNextFile.

    Da ich sicher stellen muss dass das Programm auf dem Server auch richtig und ohne abbrüche wegen nicht berücksichtigter Fälle läuft, will ich erst mal bei Euch Profis anfragen um das arbeiten mit der API sicherzustellen. So wie ich gelesen habe, muss ich mit Unicode arbeiten um über mehr als 32.000 Zeichen im Pfad-/Filenamen zugreifen zu können (hoffe aber nicht das es so ein File gibt :-) ).

    Die Dateien sind quasi XML-Files die in verschiedenen ZIP-Dateien enthalten sind.

    Ich bin nicht faul und mache das Programm soweit schon alleine, aber das mit der API ist mir etwas unsicher da ich mittlerweile mehrere Versionen mit unterschiedlichen Ansätzen gelesen habe.

    Hoffe die Informationen sind soweit ausreichend?

    Viele Grüsse,
    Maximilian

     

    PS:
    Wie macht ihr das den generell mit diesem Fehler? Wir sind denke ich nicht die einzigen mit mehr als 259 Zeichen im Pfad/Name. Mich wundert auch das MS dies nicht im Framework berücksichtigt.

    Sonntag, 16. Oktober 2011 09:11
  • Hallo Ellen,

    danke für die Antwort. Leider aber arbeitet das Framework nicht mit einem Pfad/Dateinamen mit mehr als 259 Zeichen. Daher muss ich auf deie API arbeiten.

    Viele Grüsse,
    Maximilian

    Sonntag, 16. Oktober 2011 09:12
  • PS:
    Wie macht ihr das den generell mit diesem Fehler? Wir sind denke ich nicht die einzigen mit mehr als 259 Zeichen im Pfad/Name. Mich wundert auch das MS dies nicht im Framework berücksichtigt.


    Hallo MaxiTesch,

    Schau Dir mal die folgenden Links an. Vielleicht können sie Dir weiter helfen.

    Long Paths in .NET, Part 1 of 3 [Kim Hamilton]

    Long Paths in .NET, Part 2 of 3: Long Path Workarounds [Kim Hamilton]

    Long Paths in .NET, Part 3 of 3 Redux [Kim Hamilton]

    Long Path wrapper

    Grüße,

    Robert

    Montag, 17. Oktober 2011 10:15
    Besitzer
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************
    Freitag, 21. Oktober 2011 12:05
    Besitzer