![]() |
rar-Archiv komplett?
Hi,
gibts es eine Möglichkeit mit Delphi heraus zu finden ob bei mehreren gesplitteten rar-Archiven eins fehlt oder eins nicht vollständig ist? mfg gandime |
Re: rar-Archiv komplett?
WinRar hat Kommandozeilentools dabei (z.B.: unrar.exe) und da kannst du mit unrar t archiv das archiv prüfen.
Über CreateProcess kann man den output capturen und auswerten. |
Re: rar-Archiv komplett?
Hallo!!!
Wenn man es mit Hilfe der Dateinamen machen möchte (ohne z.B. RAR-spezifische Daten auszulesen) würde ich es folgendermaßen machen: Prüfen ob alle Dateien (test1.rar, test2.r00, test3.r01 bzw. test.part1.rar, test.part2.rar etc.) vorhanden sind. Die letzte Datei sollte von der Dateigröße kleiner sein als alle anderen, die wiederum alle exakt gleich groß sein sollten (IMHO). WEnn auch die letzte Datei gleich groß ist, muß davon ausgegangen werden, daß mindestens eine folgende Datei fehlt. Sonst hilft Dir evtl. die Datei unrar.dll (o.ä.) weiter. Ggf. gibt es hier Funktionen um die Dateianzahl direkt auszulesen. Grüße, SCRaT //EDIT: Hier mal ein Demo PRogramm dazu: ![]() |
Re: rar-Archiv komplett?
@scrat1979
Die Idee hatte ich auch schon aber ich weiss nie wie viele archive es sind und wenn eins fehlt oder eingelne nicht ganz runtergeladen kann der Problem auftreten: So kann der Fall auftreten, dass die letzte Datei abgeschnitten ist und es somit alles fälschlich als komplett erkannt wird! @Whookie Die Idee ist gut! Hast du mal ein Code Beispiel, da ich mit dem Thema output capturen noch nie etwas gemacht habe! |
Re: rar-Archiv komplett?
Die einfachste Variante (ohne zwischen Ergbnisse) ist folgende:
Delphi-Quellcode:
Die Ausgabe erfolgt über SetWindowText und dafür kann man z.B.: ein Memo.Handle angeben.
function ExecAndCaptureConsoleApp(CommandLine: String; OutputWindow: hWnd): Integer;
const BufSize = $4000; var StartupInfo:TStartupInfo; ProcessInfo:TProcessInformation; WriteHandle, ReadHandle: THandle; ReadBuf: array[0..BufSize] of Char; BytesRead: DWord; begin FillChar(StartupInfo,SizeOf(StartupInfo), 0); FillChar(ReadBuf, SizeOf(ReadBuf), 0); CreatePipe(ReadHandle, WriteHandle, nil, BufSize); with StartupInfo do begin cb:= SizeOf(StartupInfo); dwFlags:= STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; hStdOutput:= WriteHandle; hStdError:= WriteHandle; wShowWindow:= SW_HIDE; end; if not CreateProcess(nil, PChar(CommandLine), nil, nil, false, DETACHED_PROCESS or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin Result:= -1 end else begin WaitForSingleObject(ProcessInfo.hProcess, INFINITE); ReadFile( ReadHandle, ReadBuf, BufSize, BytesRead, nil); SetWindowText(OutputWindow, ReadBuf); GetExitCodeProcess(ProcessInfo.hProcess, DWord(Result)); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread) end; CloseHandle(WriteHandle) end; Besser ist es natürlich z.B. eine TStringlist zu befüllen und diese zurückzugeben oder auch bei längeren Aufrufen über [Delphi} Win32Check(GetExitCodeProcess(FProcessInfo.hProces s, FExitCode)); // liefert STILL_ACTIVE bis der Process endet [/Delphi] in einer Schleife abzufragen, ob der Prozess noch läuft und gegebenenfalls Rückgaben sofort anzuzeigen. |
Re: rar-Archiv komplett?
hmm joa sieht ganz gut aus aber bei mir macht er nach:
Delphi-Quellcode:
diesem aufruf nicht weiter.
ReadFile( ReadHandle, ReadBuf, BufSize, BytesRead, nil);
Ich starte die Funktion so:
Delphi-Quellcode:
var
h:hWnd; begin ExecAndCaptureConsoleApp('rar.exe t D:\a.rar',h); end; |
Re: rar-Archiv komplett?
Versuch mal ein Memo auf deiner Form und dann:
Delphi-Quellcode:
ExecAndCaptureConsoleApp('rar.exe t D:\a.rar',Memo1.Handle);
|
Re: rar-Archiv komplett?
es ist immer noch das selbe es wird nach
Delphi-Quellcode:
nicht weiter gemacht!
ReadFile( ReadHandle, ReadBuf, BufSize, BytesRead, nil);
Also kann es garnicht zum auslesen des textes mit
Delphi-Quellcode:
kommen...
SetWindowText(OutputWindow, ReadBuf);
|
Re: rar-Archiv komplett?
Das liegt daran, dass ReadFile hier blockierend arbeitet, das heißt, es wird gewartet, bis auch $4000 Bytes in der Pipe sind. Bufsize sollte man meiner Meinung nach vorher mit PeekNamedPipe ermitteln.
|
Re: rar-Archiv komplett?
und wie mache ich das? Also welche Paramter muss ich bei PeekNamedPipe eingeben?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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