![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 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