Auslesen von Dateititel, Zusammenführen der Dateien wenn alle Seiten sich im Ordner befinden

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets3646.

    Auslesen von Dateititel, Zusammenführen der Dateien wenn alle Seiten sich im Ordner befinden

    Hallo zusammen

    Wir haben mehrere Dateien, die sich in einem Ordner befinden. Der Titel der Datei ist immer eindeutig und enthält noch Zusatzangaben, welche Seite und wie viele Seiten es sich handelt, bspw. 895742-01-03. Heisst, dass die 895742 eindeutig ist, Bindestrich "-" ist der Trenner, die 01 ist die Seite 1 von und die 03 die Gesamtzahl der Dateien.

    Ziel ist es, so lange in einem Ordner zu suchen, über den eindeutigen Wert abzufragen und die Datei, wenn alle Seiten zusammen sind, dann auch noch zusammenzuführen. Dateityp ist entweder tiff oder pdf.

    Habt ihr eine Idee, wie ich dies realisieren kann.

    Gruss naubie
    Probier es mal so:

    VB.NET-Quellcode

    1. Dim fi() As IO.FileInfo = New IO.DirectoryInfo("c:\Temp\xxx").GetFiles("??????-01-0?.txt")

    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!
    Hallo zusammen

    Ich habe jetzt eine schöne Dateiliste erhalten, die in einer Listbox ausgegeben wird.

    Ich glaube jetzt kommt die eigentliche Aufgabe:
    Die Dateien bestehen hier aus drei Seiten. Die aktuelle Datei 234567-234567-01-03 ist Seite 1 von 3. Jetzt soll so lange gesucht werden, anhand der ersten Nummer 234567, bis alle Dateien in diesem Ordner sind.

    Es wurde ja geschrieben, dass das zusammenführen möglichweise nicht geht. Evtl. kann man einfach das Ergebnis inkl. aller Files in einen anderen Ordner schreiben, dann schau ich mal wegen Weiterverarbeitung.
    Bilder
    • dateiliste.JPG

      15,1 kB, 155×114, 393 mal angesehen

    naubie schrieb:

    Ich glaube jetzt kommt die eigentliche Aufgabe:
    War doch alles schon da.
    Natürlich nicht für Deine explizite Zeichenfolge vorbereitet, aber da:

    VB.NET-Quellcode

    1. Dim fi() As IO.FileInfo = New IO.DirectoryInfo("c:\Temp\xxx").GetFiles("234567*.pdf")
    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!
    Hab ich ja.

    VB.NET-Quellcode

    1. Dim fi() As IO.FileInfo = New IO.DirectoryInfo(Directory.GetCurrentDirectory).GetFiles("??????-??????-??-??.pdf")
    2. lstDateiliste.DataSource = fi


    Die Werte sind nun in der Listbox. Jetzt will ich diese mit einer Splitfunktion (Trenner -) in die einzelnen Werte aufteilen.
    Wenn ich ein Textfeld haben, wo ich die Werte eingeben kann, erledige ich den Split mit

    VB.NET-Quellcode

    1. teil = eingabe.Split("-")
    .
    Wie trenne ich denn die Werte, aus meiner Dateiliste und dann die nächste Frage, wie kann ich denn feststellen, wann nun meine Dateien vollständig sind, da ich ja Seiten x von y habe?

    naubie schrieb:

    Wie trenne ich denn die Werte, aus meiner Dateiliste
    Da musste halt mit dem Dateinamen (fi.Name) ein wenig Textverarbeitung machen.
    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!

    naubie schrieb:

    "1-dimensionales array von string kann nicht in string konvertiert werden"
    Dann mach es so:

    VB.NET-Quellcode

    1. Dim a = bla
    2. ' ==>
    3. Dim a() = bla
    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!
    Hier ist ein kompletter Code, komplett auskommentiert, extra für dich ;)

    EDIT: Da RodFromGermany das net gut fand, versuch ich, das Ganze gut zu erklären

    Zuerst deklarieren wir ein paar Variablen, die alle nötigen Informationen beinhalten

    VB.NET-Quellcode

    1. Dim intDocumentNumber As Integer = 895742 'Dokumentnummer
    2. Dim strDirectory As String = "C:\OrdnerMitDateien" 'Pfad zum Ordner
    3. Dim strFileExtension As String = "pdf" 'Dateiendung


    Nun rufen wir alle Dateien, die die Dokumentnummer und und die angegebene Dateiendung besitzen ab und legen sie in ein Array

    VB.NET-Quellcode

    1. Dim fiFoundFiles() As FileInfo = New DirectoryInfo(strDirectory).GetFiles(intDocumentNumber.ToString & "*." & strFileExtension)


    Dann gucken wir, ob das Array überhaupt etwas enthält. Wenn nichts enthalten ist, dann wird eine MsgBox angezeigt und die Sub beendet.

    VB.NET-Quellcode

    1. If fiFoundFiles.Length = 0 Then
    2. MsgBox("Keine Dateien gefunden")
    3. Exit Sub
    4. End If


    Dann extrahieren wir die Anzahl der Parts aus dem Namen der ersten gefundenen Datei

    VB.NET-Quellcode

    1. Dim intExistingParts As Integer = CInt(fiFoundFiles(0).FullName.Split(CChar("-"))(2).Replace("." & strFileExtension, "")) 'Anzahl aller existierenden Parts


    Dann erstellen wir zwei Listen, die eine enthält die Pfade aller gefundenen Parts, die andere die Nummern derer, die nicht gefunden wurden.

    VB.NET-Quellcode

    1. Dim lstNotFoundParts As List(Of Integer) = New List(Of Integer) 'Alle nicht gefundenen Parts, aufsteigend geordnet
    2. Dim lstFullPathOfFoundParts As List(Of String) = New List(Of String) 'Alle gefundenen Parts, aufsteigend geordnet


    Nun zählen wir von 1 bis zur Anzahl der Parts durch und prüfen jeweils, ob eine Datei mit einem Pfad existiert, welcher basierend auf deinem Benennungssystem aus dem zu durchsuchenden Ordner, der Dokumentnummer, einer Partnummer, der Anzahl der Parts und der Dateiendung zusammengestellt wird ([Pfad]\[Dokumentnummer]-[Partnummer]-[AnzahlParts].[Dateiendung]).
    Wenn die Datei existiert, wird der Pfad zur Liste mit allen gefundenen Dateien hinzugefügt, wenn nicht, wird die Partnummer zu der Liste der nicht gefundenen Parts hinzugefügt.
    Wenn man bei einem Integer .ToString("00") anwendet, bedeutet das, dass er mit 2 Stellen ausgegeben wird (2 -> 02, 12 -> 12).

    VB.NET-Quellcode

    1. For intPart As Integer = 1 To intExistingParts 'Prüft für jeden Part, ob er vorhanden ist
    2. Dim strFilePath As String = strDirectory & "\" & _
    3. intDocumentNumber.ToString & "-" & _
    4. intPart.ToString("00") & "-" & _
    5. intExistingParts.ToString("00") & "." & strFileExtension 'Setzt Dateinamen und -pfad zusammen
    6. If File.Exists(strFilePath) Then 'Prüft, ob der Part vorhanden ist
    7. lstFullPathOfFoundParts.Add(strFilePath)
    8. Else
    9. lstNotFoundParts.Add(intPart)
    10. End If
    11. Next


    Hier ist dann noch eine Beispielhafte Auswertung, die alle nicht gefundenen Parts auflistet.

    VB.NET-Quellcode

    1. Dim strShow As String = ""
    2. For Each intitm As Integer In lstNotFoundParts 'Listet jeden nicht gefundenen Part in einer MsgBox auf
    3. strShow &= intitm.ToString("00") & " "
    4. Next
    5. MsgBox(strShow, MsgBoxStyle.Information, "Nicht gefundene Parts") 'Zeigt die MessageBox


    Oder eine Auswertung, die die Pfade aller gefundenen Parts auflistet:

    VB.NET-Quellcode

    1. Dim strShow As String = ""
    2. For Each stritm As Integer In lstFullPathOfFoundParts 'Listet jeden nicht gefundenen Part in einer MsgBox auf
    3. strShow &= stritm & " "
    4. Next
    5. MsgBox(strShow, MsgBoxStyle.Information, "Gefundene Parts") 'Zeigt die MessageBox


    Hoffe, es hilft dir weiter
    [/vb]

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nafets3646“ ()

    @nafets3646: Und wenn @naubie: diesen "Code" abgeschrieben und trotzdem nicht verstandenn hat, nimmst Du ihn ans Händchen und rückst den Code gerade?
    (kommt Dir dies bekannt vor?)
    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!
    @nafets3646 Und wenn @naubie diesen "Code" abgeschrieben und trotzdem nicht verstandenn hat, nimmst Du ihn ans Händchen und rückst den Code gerade?

    (kommt Dir dies bekannt vor?)
    Schon Wieder :D. Ich versuche doch nur zu helfen. Was soll ich denn anders machen?

    PS: Liest du dir jeden Forumseintrag durch?^^

    EDIT: Ist doch fast genauso wie mit dem Sourcecode-Austausch, dort lernt man größtenteils genauso viel wie hier

    EDIT2: Habs abgeändert (noch genauer erklärt), hoffe dir gefällts ;)

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

    nafets3646 schrieb:

    Ich versuche doch nur zu helfen. Was soll ich denn anders machen?
    Machst Du für jeden die Hausaufgaben? Und die nächste Hausaufgabe wieder?
    Das sollen die Kollegen selbst machen. Wir wollen ihnen Hilfestellung geben, damit sie die nächste Hausaufgabe selbst erledigen können.
    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 seh das bischen optimistischer: Indem @nafets3646: so engagiert codet, ist er nämlich der eigliche Profiteur der Threads.
    Die "geholfenen" TEs machen vlt. stumpf copy&paste ohne iwas zu schnallen, aber @nafets3646: kann jede Menge lernen, wenn wir fleißig an seim Code rum-mäkeln. :thumbsup:
    @RodFromGermany
    Bei so ner Frage kann man ja nicht einfach 20 Links mit verschiedenen Tutorials und co. posten. Außerdem haben die Fragesteller doch warscheinlich eh nur Interesse am Code. Würden sie das lieber selber proggen, würden sie mal ein kleines Konzept ausarbeiten und dieses dann mithilfe von Google und co. proggen.

    nafets3646 schrieb:

    Außerdem haben die Fragesteller doch warscheinlich eh nur Interesse am Code.
    Hätten sie Interesse an Deinem Geld, gäbest Du ihnen Dein Geld :?: :D :D :D
    Nimm sie bei der Hand und führe sie in die richtige Richtung.
    Sieh nach, was andere schon gepostet haben, wenn die die Hand-Führ-Methode anwenden, kommst Du mit der C&P-Methode nicht unbedingt gut an.
    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!