Entzip-Program

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Phil.

    Entzip-Program

    hallo,

    wer kennt das nicht? man lädt was runter und es ist gezippt. nun stellt sich die frage, ob im zip-paket ein eigener ordner drin ist oder nicht. bei den meisten zip-programmen hat man die möglichkeit per rechtsklick entweder "hier entpacken" oder "entpacken in name_der_datei\" auszuwählen.
    nun meistens wähle ich die zweite version. jedoch ist es dann meistens so dass in dem gerade erstellten ordner wieder nur ein ordner drin ist. falls ich mal die andere option nehme, dann sind natürlich 100 einzelne dateien verstreut in meinem download-ordner. ich hoffe der sachverhalt ist klar ^^

    deswegen würde ich gerne ein eigenes unzip-programm schreiben, welches vorher prüft ob im zip-paket ein eigenständiger ordner bzw nur eine datei drin liegt, wenn ja dann wird alles im aktuellen ordner-entpackt. wenn nicht soll die datei in einem neuen ordner entpackt werden.

    ist dies überhaupt möglich? kann man mit visual basic 2005 ein programm schreiben, welches alle gängigen zip- und rar-dateien entpacken kann? wenn ja: wie ließe sich dies anstellen? wo sollte ich anfangen? wäre über jede idee oder über jeden link, der mir helfen könnte, froh.

    oder kennt ihr ein unzip-programm welches meine funktion schon integriert hat? wenn ja, könnte ich mir nämlich die arbeit sparen :D


    ich hoffe man kann verstehen was ich wissen möchte :))
    ich hab auch mal sonen ähnliches Problem gehabt, ich hab nen ganz nützliches unzip-Programm gefunden, das auch nicht irgendwie installiert werden muss. Was das alles kann, weiß ich nicht genau, aber das kannst du ja rausfinden....
    binaryessence.de/prd/deDL0010.htm
    hey, danke für die antworten, aber ich hab jetzt doch ein eigenes programm geschrieben. es baut auf die 7zip-command version auf. und prüft eben vorher wie viel dateien enthalten sind.
    wenn das programm installiert ist muss man nur alle zip und rar dateien mit dem programm verknüpfen (also dass sie standardmäßig mit meinem programm geöffnet werden) und schon wird alles automatisch gemacht.
    falls interesse besteht, kann ich ja den quellcode posten.
    okay, dann poste ich mal den quellcode. der vorteil ist eben dass alle dateien behandelt werden können, die auch 7-zip behandeln kann; und das sind schon ein paar :))

    habs noch schnell kommentiert, damit man es besser nachvollziehen kann.

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Const sz_path As String = "C:\Program Files\7-Zip\7z" 'pfad zu sevenzip. eigentlich heißt die 7zG.exe aber es muss trotzdem 7z heißen
    3. Dim archive_filepath As String 'pfad zum archiv welches entpackt werden soll
    4. Dim archive_Directorypath As String 'pfad in dem das archiv drin liegt
    5. Dim dest_path As String 'pfad wo der inhalt entpackt werden soll
    6. Dim filename As String 'der name des archivs (ohne suffix)
    7. Dim ausgabe As String
    8. Dim IntAnzahl As Integer
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. Me.Visible = False 'unsichtbar machen
    11. Dim test As Boolean = False
    12. If Command$() <> "" Or test Then 'wenn ein parameter vorhanden ist dann
    13. If test Then
    14. archive_filepath = "testpfad"
    15. Else
    16. archive_filepath = Mid(Command$(), 2, Len(Command$()) - 2) 'anführungszeichen (vorne und hinten) werden abgeschnitten
    17. End If
    18. archive_Directorypath = detect_archiv_directorypath() 'ordner-pfad vom archiv wird ermittelt
    19. filename = detect_filename() 'dateiname des archivs (ohne suffix) wird ermittelt)
    20. dest_path = """" & func_dest_path() & """" 'zielpfad wird festgelegt (mit anführungszeichen)
    21. If dest_path = """""" Then
    22. MsgBox("Beim Entpacken ist ein Fehler aufgetreten. Das Archiv ist möglicherweise beschädigt.", MsgBoxStyle.Exclamation, "Fehler")
    23. Else
    24. Dim befehl As String = sz_path & " x """ & archive_filepath & """ -o" & dest_path & " -aou"
    25. Shell(befehl) 'x entpackt mit allen pfaden den folgenden pfad. auf -o folgt der zielpfad. -aou bewirkt dass nichts überschrieben wird, sondern automatisch die zu entpackenden dateien umbenannt werden
    26. End If
    27. End If
    28. Me.Close() 'schließen
    29. End Sub
    30. Private Function detect_filename() As String
    31. Dim i As Integer = 0
    32. detect_filename = ""
    33. While Mid(archive_filepath, Len(archive_filepath) - i, 1) <> "\"
    34. detect_filename = Mid(archive_filepath, Len(archive_filepath) - i, 1) & detect_filename
    35. i += 1
    36. End While
    37. i = 0
    38. While Mid(detect_filename, Len(detect_filename) - i, 1) <> "."
    39. i += 1
    40. End While
    41. i += 1
    42. detect_filename = Mid(detect_filename, 1, Len(detect_filename) - i)
    43. End Function
    44. Private Function detect_archiv_directorypath() As String
    45. Dim i As Integer = 0
    46. While Mid(archive_filepath, Len(archive_filepath) - i, 1) <> "\"
    47. i += 1
    48. End While
    49. i += 1
    50. Return Mid(archive_filepath, 1, Len(archive_filepath) - i) 'erste "-zeichen wird abgeschnitten
    51. End Function
    52. Private Function func_dest_path() As String
    53. IntAnzahl = anzahl()
    54. If IntAnzahl < 0 Then _
    55. Return ""
    56. If IsNewDirectoryDemanded() Then 'neuen ordner erstellen
    57. If IO.Directory.Exists(archive_Directorypath & "\" & filename) Then 'wenn der pfad schon besteht, dann einen neuen finden
    58. Dim i As Integer = 1
    59. While IO.Directory.Exists(archive_Directorypath & "\" & filename & " " & i)
    60. i += 1
    61. End While
    62. IO.Directory.CreateDirectory(archive_Directorypath & "\" & filename & " " & i)
    63. Return archive_Directorypath & "\" & filename & " " & i
    64. Else
    65. IO.Directory.CreateDirectory(archive_Directorypath & "\" & filename)
    66. Return archive_Directorypath & "\" & filename
    67. End If
    68. Else 'bestehenden pfad zurückgeben
    69. Return archive_Directorypath
    70. End If
    71. End Function
    72. Private Function IsNewDirectoryDemanded() As Boolean
    73. Dim lines() As String = ausgabe.Split(Chr(13))
    74. Dim files(IntAnzahl - 1) As String
    75. For i As Integer = 7 To lines.Length - 1 - 3
    76. files(i - 7) = Mid(lines(i), 54)
    77. Next
    78. Dim stammordner As String = files(0)
    79. IsNewDirectoryDemanded = False
    80. For i As Integer = 1 To IntAnzahl - 1
    81. If Mid(files(i), 1, Len(stammordner) + 1) <> stammordner & "\" Then _
    82. IsNewDirectoryDemanded = True
    83. If IsNewDirectoryDemanded = True Then _
    84. Return True
    85. Next
    86. End Function
    87. Private Function anzahl() As Integer
    88. Dim ObjShell = CreateObject("WScript.Shell")
    89. Dim befehl As String = sz_path & " l """ & archive_filepath & """" 'informationen auflisten lassen
    90. Dim ObjExec = ObjShell.exec(befehl)
    91. ausgabe = ObjExec.StdOut.ReadAll 'ausgabe in variable einlesen
    92. If InStr(ausgabe, "Error:") Then 'wenn ein fehler aufgetreten ist -1 zurückgeben
    93. Return -1
    94. Else
    95. Dim i As Integer = Len(ausgabe)
    96. Dim z As Integer = 0
    97. Dim zahl As String = ""
    98. While z < 2 'zahl auslesen
    99. If Mid(ausgabe, i, 1) = " " Then z += 1
    100. If IsNumeric(Mid(ausgabe, i, 1)) Then zahl = Mid(ausgabe, i, 1) & zahl
    101. i -= 1
    102. End While
    103. Return zahl
    104. End If
    105. End Function
    106. End Class




    der einzigste nachteil ist, dass es keine fortschrittsanzeige gibt :/
    aber vllt fällt mir da auch noch was ein.


    ps: warum werden die tabstops in den vb-tags nicht richtig angezeigt? denn dann wären die kommentare schön untereinander gewesen.


    /edit:
    okay, habe ein problem. 7zip listet alle dateien aus einem archiv auf; auch wenn alle in einem ordner stecken. dadurch wird von meinem programm immer ein neuer ordner erstellt wenn mehrere dateien in dem archiv vorhanden sind, auch wenn die dateien alle in einem ordner stecken.
    ich arbeite gerade an einer lösung :/

    /edit nr. 2:
    okay, habe das problem gelöst. es sollte jetzt eigentlich alles funktionieren :)
    (habe den schon vorhanden code korrigiert.)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Phil“ ()

    der einzigste nachteil ist, ...
    Du weißt schon, dass es einzige heißt? :P

    der vorteil ist eben dass alle dateien behandelt werden können, die auch 7-zip behandeln kann
    7zip ist in 99% der Fälle besser oder schneller als RAR und es ist Open Source. Leider ist RAR im Netz viel zu weit verbreitet :(

    Wie gesagt: 7zip ist Open Source. Im SDK findest du ein Beispiel wie man mit C# OHNE ne .exe alle vorgänge durchführt: 7-zip.org/sdk.html
    Das schöne dran ist, dass man nichtmal ne hässliche .dll braucht; man kann das ganze Teil (den Source) reinkompilieren.
    Ich weiß aber nicht, ob da die restlichen Dateiformate (zip, tar, gz, bz2) auch drin sind :(


    so long..
    Andy
    Original von Mad Andy
    der einzigste nachteil ist, ...
    Du weißt schon, dass es einzige heißt? :P


    Hast ja recht; werde es mir merken :rolleyes: :))

    Original von Mad Andy
    Wie gesagt: 7zip ist Open Source. Im SDK findest du ein Beispiel wie man mit C# OHNE ne .exe alle vorgänge durchführt: 7-zip.org/sdk.html
    Das schöne dran ist, dass man nichtmal ne hässliche .dll braucht; man kann das ganze Teil (den Source) reinkompilieren.
    Ich weiß aber nicht, ob da die restlichen Dateiformate (zip, tar, gz, bz2) auch drin sind :(


    Ja, das hatte ich mir schon runtergeladen und angeguckt; nur leider verstehe ich von c# so gut wie gar nichts.
    Außerdem ist ja mein Programm sowieso schon fertig; nur eben die nicht vorhandene progress bar stört mich persönlich noch ein bisschen. aber vllt fällt mir da auch was ein :))