Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi rar-Archiv komplett? (https://www.delphipraxis.net/101446-rar-archiv-komplett.html)

gandime 13. Okt 2007 13:19


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

Whookie 13. Okt 2007 14:19

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.

scrat1979 13. Okt 2007 14:21

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: link

gandime 13. Okt 2007 15:06

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!

Whookie 13. Okt 2007 15:26

Re: rar-Archiv komplett?
 
Die einfachste Variante (ohne zwischen Ergbnisse) ist folgende:

Delphi-Quellcode:
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;
Die Ausgabe erfolgt über SetWindowText und dafür kann man z.B.: ein Memo.Handle angeben.

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.

gandime 13. Okt 2007 16:28

Re: rar-Archiv komplett?
 
hmm joa sieht ganz gut aus aber bei mir macht er nach:
Delphi-Quellcode:
ReadFile( ReadHandle, ReadBuf, BufSize, BytesRead, nil);
diesem aufruf nicht weiter.

Ich starte die Funktion so:
Delphi-Quellcode:
var
  h:hWnd;
begin
  ExecAndCaptureConsoleApp('rar.exe t D:\a.rar',h);
end;

Whookie 13. Okt 2007 20:19

Re: rar-Archiv komplett?
 
Versuch mal ein Memo auf deiner Form und dann:

Delphi-Quellcode:
ExecAndCaptureConsoleApp('rar.exe t D:\a.rar',Memo1.Handle);

gandime 14. Okt 2007 11:48

Re: rar-Archiv komplett?
 
es ist immer noch das selbe es wird nach
Delphi-Quellcode:
ReadFile( ReadHandle, ReadBuf, BufSize, BytesRead, nil);
nicht weiter gemacht!
Also kann es garnicht zum auslesen des textes mit
Delphi-Quellcode:
SetWindowText(OutputWindow, ReadBuf);
kommen...

Apollonius 14. Okt 2007 11:51

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.

gandime 14. Okt 2007 12:08

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.
Seite 1 von 2  1 2      

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