![]() |
Delphi-Version: XE2
Mit Rar packen per Datei-Liste
Hallo Delphianer,
ich benutze in meinem Programm die RAR.EXE um Dateien und Verzeichnisse zu packen. Sobald ich aber mit einer Datei-Liste, welche ich an RAR übergeben möchte, packen will, so wird nur die Datei-Liste selbst gepackt, aber nicht die darin enthaltenen Dateinamen, die gepackt werden sollen. Auf DOS-EBENE funktioniert das einwandfrei : z.b. in der backup.lst befinden sich mehrere Dateinamen und ein Ordner alles wird sauber gepackt.
Code:
Nun wollte ich das in Delphi nachbilden :
C:\>rar a d:\test.rar @backup.lst
Code:
Er öffnet also nicht die Datei : backup.lst um die dateinamen auszulesen, sondern packt die erstellte backup.lst ins Archiv
//*****************************************************************************
// wenn als RAR gepackt werden soll, dann dies ..... if DLS.PACK = 'RAR' then begin sLabel1.Visible := true; // Bitte warten ---- anzeigen PATH := ExtractFilePath(ParamStr(0)); RarFilename := ini.ReadString('VERZ','tempSend','') + ZielTemp+'\'+EditPackName.Text; TempPath := frmDLS.JamPathLabel_ZIEL.Path; // --------- Parameter für paramPack ------------------------------- // a : fügt die Dateien dem Archiv zu // - r : rekursive Verzeichnissuche nach Dateien die hinzugefügt werden // - ep1 : Stammverzeichnis aus dem Namen entfernen // - df : Dateien nach dem archivieren löschen (optional) { ****** Datei-Liste zusammenstellen ********* } for X := 0 to frmDLS.ZIEL_O.Items.Count-1 do begin WriteDateien(frmDLS.ZIEL_O.Items[X].Caption); // Dateiname oder Ordnername in backup.lst schreiben end; // paramPack := Format('a -r -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"', [RarFilename, TempPath]); // Dies funktioniert paramPack := Format('a "%s" @backup.lst', [RarFileName]); // <<----------- hier liegt der Fehler { if Splitting = 100 then paramPack := Format('a -r -v100000k -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"', [RarFilename, TempPath]); if Splitting = 500 then paramPack := Format('a -r -v500000k -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"', [RarFilename, TempPath]); if Splitting = 1000 then paramPack := Format('a -r -v1000000k -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"', [RarFilename, TempPath]); } Application.ProcessMessages; ExecuteProgramm(PChar(PATH + '\rar.exe'),PChar(paramPACK)); Ich denke mal, es liegt am Parameter @backup.lst |
AW: Mit Rar packen per Datei-Liste
Was arbeitest du auch mit relativen Pfaden?
Da weiß man doch nie wo die Datei nun wirklich gesucht wird (aktuelles Arbeitsverzeichnis). Bzw. stimmen denn die Pfadangaben alle? |
AW: Mit Rar packen per Datei-Liste
Hallo himitsu,
ja, die Pfade stimmen. Die RAR.Exe liegt im Programmpfad. Die backup.lst wird im Programmverzeichnis der Anwendung erzeugt. Aber mir scheint, als wenn er mit dem RAR Parameter @backup.lst nicht klar kommt, bzw. diese textdatei nicht öffnet und ausliest |
AW: Mit Rar packen per Datei-Liste
Und wenn Du die Datei mit absolutem Pfad übergibst?
|
AW: Mit Rar packen per Datei-Liste
Hallo DeddyH,
danke für den Hinweis. Ich habe auch schon folgendes probiert, 'a c:\test.rar @c:\backup.lst' hat aber auch nichts gebracht, die backup.lst wird nicht ausgelesen. Auf Dosebene funktioniert es aber so: rar a c:\test.rar @c:\backup.lst |
AW: Mit Rar packen per Datei-Liste
Hmm... langsam gehen mir die Ideen aus, ich bin schon fast versucht, mal übern Berg zu fahren *g*.
|
AW: Mit Rar packen per Datei-Liste
Gibt es Leerzeichen im Pfad?
bzw. sind noch andere Zeichen im Pfadnamen enthalten, außer : \ A-Z a-z 0-9 - _ Und was macht ExecuteProgramm? Kann man dort irgendwie den Fehlercode Exitcode des Programms bekommen? |
AW: Mit Rar packen per Datei-Liste
Liste der Anhänge anzeigen (Anzahl: 4)
Hallo himitsu,
gestern konnte ich auf Deine Fragen nicht mehr antworten, deshalb erst jetzt: zu 1: Nein , es gibt keine Leerzeichen im Pfad zu 2: hier der Code zu Execute Programm
Code:
..und hier der Code nochmal für die RarRoutine welche ExecuteProgramm aufruft:
Procedure ExecuteProgramm(Const PFileName,Params: String);
Var SEInfo : TShellExecuteInfo; ExitCode : DWORD; ExecuteFile : String; Begin ExecuteFile:='"'+PFileName+'"'; FillChar(SEInfo,SizeOf(SEInfo),0); SEInfo.cbSize:=SizeOf(TShellExecuteInfo); With SEInfo Do Begin fMask:= SEE_MASK_NOCLOSEPROCESS; Wnd:= Application.Handle; lpFile:= PChar(ExecuteFile); lpParameters:= PChar(Params); nShow:= SW_SHOWNORMAL; End; If ShellExecuteEx(@SEInfo) Then Repeat Sleep(50); Application.ProcessMessages; GetExitCodeProcess(SEInfo.hProcess, ExitCode); FLAG := ExitCode; Until (ExitCode<>STILL_ACTIVE) Or Application.Terminated; End;
Code:
zu guter Letzt noch der Code zu WriteDateien :
//*****************************************************************************
// wenn als RAR gepackt werden soll, dann dies ..... if DLS.PACK = 'RAR' then begin sLabel1.Visible := true; // Bitte warten ---- anzeigen PATH := ExtractFilePath(ParamStr(0)); RarFilename := ini.ReadString('VERZ','tempSend','') + ZielTemp+'\'+EditPackName.Text; TempPath := frmDLS.JamPathLabel_ZIEL.Path; DATEILIST := '@'+ExtractFilePath(ParamStr(0))+'backup.lst'; // --------- Parameter für paramPack ------------------------------- // a : fügt die Dateien dem Archiv zu // - r : rekursive Verzeichnissuche nach Dateien die hinzugefügt werden // - ep1 : Stammverzeichnis aus dem Namen entfernen // - df : Dateien nach dem archivieren löschen (optional) { Datei-Liste zusammenstellen } for X := 0 to frmDLS.ZIEL_O.Items.Count-1 do begin WriteDateien(frmDLS.ZIEL_O.Items[X].Caption); end; if Splitting = 0 then //paramPack := Format('a -r -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"', [RarFilename, TempPath]); paramPack := Format('a "%s" "%s"',[RarFilename, DateiList]); if Splitting = 100 then paramPack := Format('a -r -v100000k -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"', [RarFilename, TempPath]); if Splitting = 500 then paramPack := Format('a -r -v500000k -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"', [RarFilename, TempPath]); if Splitting = 1000 then paramPack := Format('a -r -v1000000k -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"', [RarFilename, TempPath]); Application.ProcessMessages; ExecuteProgramm(PChar(PATH + '\rar.exe'),PChar(paramPACK)); //Shellexecute(0, 'open', PChar(PATH + 'rar.exe'), PChar(paramPACK), nil, SW_SHOW); frmDLS.sStbar_DLS.Panels[3].Text := '['+IntToStr(Flag)+'] : Packvorgang war erfolgreich !'; if Flag = 0 then Showmessage('['+IntToStr(Flag)+'] : Packvorgang war erfolgreich !'); { Error Codes für RAR 255 = USER BREAK Anwender hat Process gestoppt 9 = CREATE ERROR Erzeugt einen Dateifehler 8 = MEMORY ERROR Speicher out of Memory(nicht genügend Speicher 7 = USER ERROR Kommandozeilenfehler (OPTIONEN) 6 = OPEN ERROR 5 = WRITE ERROR 4 = LOCKED ARCHIVE gesperrtes Archiv 3 = CRC ERROR 2 = FATAL ERROR 1 = WARNING 0 = ERFOLGREICH}
Code:
hier mal ein paar Debug-Infos:const LOGFILE = 'USER.log'; LOGFILE1 = 'dataOUT.log'; LOGFILE2 = 'dataIN.log'; PACKLIST = 'backup.lst'; function WriteDateien(LogString: String) : Integer; var f: TextFile; begin {$IOChecks OFF} AssignFile(f, ExtractFilePath(ParamStr(0))+PACKLIST); if FileExists(ExtractFilePath(ParamStr(0))+PACKLIST) then Append(f) else Rewrite(f); Writeln(f, LogString); CloseFile(f); result := GetLastError(); {$IOCHECKS ON} end; 4.jpg zeigt den ExitCode (10) |
AW: Mit Rar packen per Datei-Liste
Das @ steht an der falschen Stelle, behaupte ich mal, das sollte ja vor die Anführungszeichen des Pfads.
[edit] Übrigens musst Du nicht pollen, mit WaitForSingleObject kannst Du auch ermitteln, wann das gestartete Programm beendet wurde. [/edit] |
AW: Mit Rar packen per Datei-Liste
Hallo DeddyH,
danke für den Hinweis, werde es gleichmal ausprobieren mit dem (@), nur das mit dem Pollen versteh ich noch nicht Wo müßte der Code bezüglich (WaitForSingleObject) geändert werden ? Gruß nachtstreuner |
AW: Mit Rar packen per Datei-Liste
Ein Beispiel von vielen:
![]() |
AW: Mit Rar packen per Datei-Liste
Nja, optisch sieht ExecuteProgramm schon so aus, als wenn es funktionieren könnte.
Nur noch in eine Funktion umwandeln oder ein Out/Var-Parameter für den ExitCode und diesen dann auch noch auswerten. |
AW: Mit Rar packen per Datei-Liste
Hallo DeddyH,
Die Erklärungen tragen leider nichts zur Lösung meines Problems bei, sind aber sehr interessant und im Code mit Sicherheit zu berücksichtigen. Werde ich auch testen. Nach langem Probieren, warum die Packliste(@backup.lst) nicht ausgelesen wurde, habe ich nun die vermeintliche Lösung gefunden. Ich mache noch ein paar Tests in Bezug auf Leerzeichen, Sonderzeichen in Dateinamen und werde das Ergebnis posten bzw. wenn gewünscht werde ich versuchen, wenn nun alles sauber funktioniert ein aussagekräftiges Tut. zu schreiben, für alle die sich mit den Kommandozeilen in der RAR.exe herumschlagen wollen. Beim jetzigen Test, werden sowohl ganze Ordner mit Unterordner , sowie Dateien mit RAR aus Delphi heraus gepackt. Wunschweise auch mit Ursprungspfad oder auch Ohne (siehe param -ep1). Wie gesagt ich melde mich gleich wieder. Gruß nachtstreuner Alles wird gut - |
AW: Mit Rar packen per Datei-Liste
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo himitsu,
den ExitCode werte ich doch aus.
Code:
Oder nicht ?
if Flag = 0 then Showmessage('['+IntToStr(Flag)+'] : Packvorgang war erfolgreich !');
|
AW: Mit Rar packen per Datei-Liste
Hallo Delphianer,
nun hat alles geklappt: - erstelle Datei-Liste mit den zu packenden Dateien (backup.lst) im Programmverzeichnis der .exe - packen von einzelnen Dateien, sowie ganzen Ordnern samt Unterverzeichnissen - funktioniert auch mit Leerzeichen usw. in Dateinamen - werte den ReturnCode nach dem Packen aus 0 = erfolgreich > 0 nicht erfolgreich, mit Ausgabe des Fehlers - warten bis Packvorgang abgeschlossen ist. - Packen mit Splitting des Archives in 100 Mb, 500 Mb oder 1 GB Nun zum eigentlichen Fehler : in der DOKU zu RAR stand die Dateiliste soll eine einfache Textdatei sein, wo nur die Dateinamen bzw. Ordnernamen drin stehen. Dies war leider nicht ganz richtig !!! Die Liste (backup.lst) muss zu den Dateinamen(Ordnernamen) auch den vollständigen Pfad zu den Dateien(Ordnern) beinhalten. z.B. falsch Datei1.txt Datei2.txt Ordner1 Ordner2 richtig wäre : LW:\Pfad\Datei1.txt LW:\Pfad\Datei2.txt LW:\Pfad\Ordner1 LW:\Pfad\Ordner2 hier nochmal ein Beispiel um Dateien zu packen:
Code:
Erklärung der Parameter :
paramPack := Format('a -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"',[RarFilename, '@'+DateiList]);
a : Dateien zum Archiv hinzufügen (Befehl) -ep1 : Ausgangsverzeichnis aus den Dateinamen entfernen (Schalter) -ms : *.zip;*.rar;*.jpg usw. Liste der Dateitypen die vom Packen ausgeschlossen werden (Schalter) "%s" : Platzhalter für den Namen des Archives und der zweite ist der Platzhalter für den Namen der Dateiliste @ : hiermit wird Rar.exe angewiesen in dieser Liste nach den Dateinamen zu suchen, welche gepackt werden sollen zweites Beispiel : Packen mit Splitting
Code:
zusätzlicher Schalter
paramPack := Format('a -v100000k -ep1 -ms*.zip;*.rar;*.jpg "%s" "%s"',[RarFilename, '@'+DateiList]);
-v100000k : Teilarchive erstellen mit einer Größe vom 10000 Kilobytes (100 MB) Ich hoffe, daß dies einigermaßen verständlich erklärt ist, wenn nicht bitte melden Danke an alle , für Eure Hinweise und Tips Gruß nachtstreuner |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz