Datei dazwischen schieben

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Madde.

    @Madde Die Schnipsel musst Du schon verstehen um Dir die paar Zeilen Code zu schreiben die Du brauchst für Deine Anforderung. Und @exc-jdbi hat Dir alle Anlaufstellen genannt die nötig sind.
    Auch die Schlagworte um eigenständig zu googlen wie DirectoryInfo, FileInfo und Array sind schon mehrfach gefallen, auch von @RodFromGermany.

    Nun bietet Dir @ErfinderDesRades schon eine Komplettlösung an.
    Meine Lösung ist sicher nicht perfekt und hat da ein paar "unebeneheiten", wo Dich @ErfinderDesRades jetzt auch noch nach fragt.

    Ich hadere immer noch mit der "Leerdatei" weil ich nicht weiß, wie die Aussehen muss damit dein Konstrukt funktioniert. Wenn eine einfache Nullbytedatei reicht ist meine Lösung sogar Kontraproduktiv.
    Aber vielleicht kommen wir ja mal weiter damit:

    VB.NET-Quellcode

    1. Private Shared Function CreateBitmapAtRuntime() As Bitmap
    2. Dim bmp As New Bitmap(78, 78)
    3. Using gr As Graphics = Graphics.FromImage(bmp)
    4. gr.Clear(Color.FromKnownColor(KnownColor.Black))
    5. End Using
    6. Return bmp
    7. End Function
    8. Private Sub renameFilesInFolder()
    9. Dim sourcePath As String = "d:\"
    10. Dim searchPattern As String = "*.tif"
    11. Dim bmp As Bitmap = CreateBitmapAtRuntime()
    12. Dim curDir As New DirectoryInfo(sourcePath)
    13. Dim z As Integer = 1 'Zähler für den Dateinamen
    14. Dim f_info As IOrderedEnumerable(Of FileInfo) = curDir.GetFiles(searchPattern).OrderBy(Function(num) num.Name) 'Sortiert nach Name. num.CreationTime würde chronologisch sortieren
    15. Dim c As Integer = f_info.Count - 1 'Für For-Schleife, wir starten bei 0
    16. For i = 0 To c
    17. f_info(i).MoveTo(Path.Combine(f_info(i).Directory.FullName, z.ToString("D5") & "_" & f_info(i).Name)) 'Hier ohne Test auf Vorhandensein der Zieldatei
    18. If i < c Then 'nach der letzten Datei soll die Bedingung nicht erfüllt sein um ein Abschluß-Leer-TIF zu vermeiden
    19. bmp.Save(Path.Combine(f_info(i).Directory.FullName, (z + 1).ToString("D5") & "_leere_seite.tif"))
    20. End If
    21. z += 2
    22. Next
    23. End Sub
    @ErfinderDesRades

    Danke für den ausführlichen Post.

    ErfinderDesRades schrieb:

    Der Sinn des ganzen ist noch etwas verdunkelt, iwie sollen die Dateien zu einem Film zusammengebastelt werden, und dazu sind wohl die leeren Seiten iwie notwendig.

    Genau das, ich benötige zwischen den eigentlichen Bildern tatsächliches ein leeres Bild. Es handelt sich hierbei um eine weiße A4-Seite im Tif-Format

    ErfinderDesRades schrieb:

    Man braucht iwie eine Eingabe, welcher Ordner überhaupt durchsucht werden soll

    Ist vorhanden. Der gewünschte Pfad wird mit einem FileBrowserDialog in eine Textbox geschrieben.

    ErfinderDesRades schrieb:

    Man braucht eine Eingabe, welche Datei als Dummy fungieren soll.

    Könnte über den gleichen Weg erfolgen.

    ErfinderDesRades schrieb:

    Und dann halt einen Button, mit dem die Umbenennerei gestartet wird.

    Ich denke, das bekomme ich hin.

    ErfinderDesRades schrieb:

    Was passiert, wenn ein Ordner angegeben wird, der bereits verarbeitet wurde?
    Oder kann ganz sicher ausgeschlossen werden, dass sich ungeeignete Dateien im Ordner befinden?
    Besteht die Möglichkeit (Befürchtung), dass, wenns fertig ist, dass sich dann zeigt, dass noch weitere Features benötigt werden?

    Es befinden sich nur diese Dateien in dem Ordner. Weitere Features sind hier nicht nötig, da der Vorgang dann abgeschlossen wäre.

    Vorab vielen Dank



    Dksksm schrieb:

    Nun bietet Dir @ErfinderDesRades schon eine Komplettlösung an.
    Meine Lösung ist sicher nicht perfekt und hat da ein paar "unebeneheiten", wo Dich @ErfinderDesRades jetzt auch noch nach fragt.


    So schnell war ich mit meiner Antwort noch nicht ;)

    Dksksm schrieb:

    Ich hadere immer noch mit der "Leerdatei" weil ich nicht weiß, wie die Aussehen muss damit dein Konstrukt funktioniert.

    Es muss keine Leerdatei erstellt werden! Bei der Leerseite handelt sich um eine vorhandene weiße A4-Seite im Tif-Format. Da habe ich mich vermutlich mißvertändlich ausgedrückt.


    MfG Madde
    Dateien
    • Leere Seite.zip

      (119,03 kB, 59 mal heruntergeladen, zuletzt: )

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

    Hier noch mein Code

    Freundliche Grüsse

    exc-jdbi
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.IO
    4. Public Module Module1
    5. Public Sub Main()
    6. 'Dim dirname = "YourDirectoryWithDirectorySeparatorChar" 'StartOrdner
    7. 'Dim dirname2 = "YourDirectoryWithDirectorySeparatorChar2" 'ZielOrdner
    8. 'Dim emptyfile = New FileInfo(YourDirectory\EmptyFile.tif)
    9. If CheckDestDirectory(dirname2) Then
    10. Dim allfile = GetAllFile(dirname)
    11. For i As Int32 = 0 To allfile.Length - 1
    12. CopyMoveToRenameFile(allfile(i), dirname2, i * 2, False)
    13. SetEmptyFile(emptyfile, dirname2, i * 2 + 1)
    14. Next
    15. End If
    16. End Sub
    17. Private Function GetAllFile(dirname As String) As FileInfo()
    18. Return New DirectoryInfo(dirname).GetFiles
    19. End Function
    20. Private Sub CopyMoveToRenameFile(ByVal fi As FileInfo,
    21. destdirname As String,
    22. idx As Int32,
    23. _onlycopy As Boolean)
    24. If fi.Exists Then
    25. Dim newfilename = GetNewFileName(fi, destdirname, idx)
    26. fi.CopyTo(newfilename)
    27. If Not _onlycopy Then fi.Delete()
    28. End If
    29. End Sub
    30. Private Sub SetEmptyFile(ByVal fi As FileInfo, destdirname As String, idx As Int32)
    31. Dim newfilename = GetNewFileName(fi, destdirname, idx)
    32. fi.CopyTo(newfilename)
    33. End Sub
    34. Private Function GetNewFileName(ByVal fi As FileInfo, destdirname As String, idx As Int32) As String
    35. Dim newfilename = String.Format("{0}_", idx.ToString.PadLeft(5, "0"c))
    36. Return destdirname & newfilename & fi.Name
    37. End Function
    38. Private Function CheckDestDirectory(destdirname As String) As Boolean
    39. If Not Directory.Exists(destdirname) Then
    40. Directory.CreateDirectory(destdirname)
    41. End If
    42. Return True
    43. End Function
    44. End Module

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Meine Lösung benutzt Settings-Binding der Textboxen, damit man nicht unbedingt jedes Mal die Folder neu eingeben muss.
    Mein Renaming/Copying-Code ist eine Umarbeitung (bis zur Unkenntlichkeit ;) ) von DksKms Code

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub btOpenToConvertDir_Click(sender As Object, e As EventArgs) Handles btOpenToConvertDir.Click
    5. FolderBrowserDialog1.SelectedPath = My.Settings.ToConvertDir
    6. If FolderBrowserDialog1.ShowDialog() <> DialogResult.OK Then Return
    7. My.Settings.ToConvertDir = FolderBrowserDialog1.SelectedPath
    8. End Sub
    9. Private Sub btOpenLeerSeitDir_Click(sender As Object, e As EventArgs) Handles btOpenLeerSeitDir.Click
    10. FolderBrowserDialog1.SelectedPath = My.Settings.LeerSeitDir
    11. If FolderBrowserDialog1.ShowDialog() <> DialogResult.OK Then Return
    12. My.Settings.LeerSeitDir = FolderBrowserDialog1.SelectedPath
    13. End Sub
    14. Private Sub btPrepareData_Click(sender As Object, e As EventArgs) Handles btPrepareData.Click
    15. Dim diSF = New DirectoryInfo("..\..\SampleFiles\")
    16. Dim diTC = New DirectoryInfo(My.Settings.ToConvertDir)
    17. If diTC.Exists Then diTC.Delete(recursive:=True)
    18. Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(diSF.FullName, diTC.FullName)
    19. End Sub
    20. Private Sub btExecuteRenamings_Click(sender As Object, e As EventArgs) Handles btExecuteRenamings.Click
    21. Dim searchPattern As String = "*.tif"
    22. Dim diLeereSeite = New DirectoryInfo(My.Settings.LeerSeitDir).GetFiles(searchPattern).First
    23. Dim diToConvert As New DirectoryInfo(My.Settings.ToConvertDir)
    24. Dim toConverts = diToConvert.GetFiles(searchPattern).OrderBy(Function(di) di.Name).ToList 'Sortiert nach Name. di.CreationTime würde chronologisch sortieren
    25. For i = 0 To toConverts.Count - 1 ' FileRenames
    26. toConverts(i).MoveTo(Path.Combine(diToConvert.FullName, (i * 2 + 1).ToString("D5") & "_" & toConverts(i).Name))
    27. Next
    28. For i = 0 To toConverts.Count - 2 ' LeerSeite-FileCopies: "dazwischen" bedeutet einen Kopiervoergang weniger
    29. diLeereSeite.CopyTo(Path.Combine(diToConvert.FullName, ((i + 1) * 2).ToString("D5") & "_" & diLeereSeite.Name))
    30. Next
    31. MessageBox.Show("Renamings and Copies done")
    32. End Sub
    33. End Class
    Zu beachten:
    • Das Verfahren mit den Settings-Bindings ist hier erläutert: Settings richtig verwenden + an Settings binden
    • Wichtig!!! Visual Studio - Empfohlene Einstellungen sind angewandt, also Strict On und kein MVB-Namespace (MsgBox und dergleichen Gekrepel)
    • Wichtig!!! Buttons und Textboxen sinnvoll benamt - da war im Original ja nicht durchzublicken mit Button1, Button2, Textbox1, Textbox2
    • Es gibt auch einen Button "PrepareData", der eine Ausgangslage wieder herstellt - im Produktivbetrieb kann der natürlich weg, ebenso wie die Ordner "LeerSeite", "SampleFiles", "ToConvert" - das ist alles nur um mehrfache Testläufe bequem abhandeln zu können.
    • Das Layout habich mittels Tablelayoutpanel dynamisch organisiert - siehe dazu Layout in Windows.Forms
    Dateien
    • LeereSeiten00.zip

      (21,93 kB, 46 mal heruntergeladen, zuletzt: )

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

    Hallo Zusammen,

    ich danke allen Beteiligten für das Engagement, hier ein Programm zu präsentieren, welches mir meinen Prozess erleichtert.

    Der Code von @exc-jdbi ist ebenso nutzbar wie der Code von @ErfinderDesRades, schränkt mich allerdings mit festen Pfaden ein, sodass die Version von @ErfinderDesRades zur Anwendung kommen wird, da sie mit FileBrowserDialog genau meinen Vorstellungen entspricht.

    Nochmals Danke!
    Euch Allen ein schönes WE.

    MfG Madde