2012-05-18 2 views
2

Quand je lance cette ligne de commande:Comment faire pour empaqueter des fichiers en utilisant 7z avec Delphi et montrer le pourcentage fait?

7z a 1.zip J:\test.mp4 

je peux voir combien en% est fait. Lorsque j'ai essayé d'exécuter ceci à partir de Delphi en utilisant CreateProcess et CreatePipe, je n'ai rien obtenu jusqu'à ce que le fichier soit compressé. Ensuite, il a affiché la sortie finale de 7zip.

Mon code ressemble à ceci:

Stream:= THandleStream.Create(hRead); 
try 
    if not CreateProcess(nil, PChar(Cmd), nil, nil, 
         True, 0, nil, nil, StartupInfo, 
         ProcessInformation) then 
    RaiseLastOSError; 
    repeat 
    if not GetExitCodeProcess(ProcessInformation.hProcess, ExitCode) then 
     RaiseLastOSError; 

    while Stream.Position < Stream.Size do 
    begin 
     Stream.Read(C, 1); 

     if (C = #13) then 
     begin 
     Memo1.Lines.Add(S); 
     S := ''; 
     Application.ProcessMessages; 
     end 
     else if C <> #10 then 
     begin 
     S := S+C; 
     end; 
    end; 
    until ExitCode <> Still_Active; 
finally 
    Stream.Free; 
end; 

Je ne veux pas simplement créer un ZIP Archive- Je sais qu'il ya des façons plus agréables de le faire à Delphes. Je veux interagir avec une console applications. La sortie de nombreuses applications de console peut être traitée avec le code que j'ai posté, mais elle échoue avec 7zip - c'est pourquoi je demande à propos de 7zip ici. Quelle est la particularité de 7zip que sa sortie ne peut pas être capturée correctement? Comment capturer la sortie d'applications comme cette 7zip?

+2

Lire les informations de progression d'une application en ligne de commande qui utilise 'stdout' est difficile. Y a-t-il une raison pour laquelle vous utilisez 7-Zip depuis la ligne de commande pour créer des fichiers '.zip'? Il y a d'autres options qui sont plus conviviales, comme [TurboPower Abbrevia] (http://sourceforge.net/projects/tpabbrevia/), freeware avec source. Il est trivial de connecter la compression zip d'Abbrevia à une barre de progression, et si vous écrivez une application console, il y a des événements qui vous permettront de le faire facilement aussi. –

+0

Faire un fichier ZIP est plutôt un exemple que mon objectif. Je veux savoir comment je peux exécuter diverses applications en ligne de commande et capturer la sortie. La méthode que j'ai mentionnée fonctionne bien pour certaines applications, mais pas pour 7zip, donc je cherche une meilleure méthode. – Tom

+2

Ah, j'ai compris. Votre question concerne spécifiquement l'utilisation de 7-Zip depuis la ligne de commande et montre les progrès, mais vous ne le pensez pas vraiment; tu veux dire autre chose. :) Veuillez éditer votre question pour demander ce que vous voulez vraiment savoir, alors ce n'est pas trompeur et n'attire pas les réponses qui ne sont pas applicables. Merci. :) –

Répondre

4

Vous pouvez jeter un oeil sur le plug-in faite par progdigy

Barre de progression

function ProgressCallback(sender: Pointer; total: boolean; value: int64): HRESULT; stdcall; 
begin 
    if total then 
    Mainform.ProgressBar.Max := value else 
    Mainform.ProgressBar.Position := value; 
    Result := S_OK; 
end; 

procedure TMainForm.ExtractClick(Sender: TObject); 
begin 
    with CreateInArchive(CLSID_CFormatZip) do 
    begin 
    OpenFile('c:\test.zip'); 
    SetProgressCallback(nil, ProgressCallback); 
    ... 
    end; 
end; 
+0

Mais il utilise 7z.dll pas 7z.exe. – Tom

+0

Je ne pense pas que ce que je veux faire peut être fait avec 7z.exe. Il semble que de tels programmes ne peuvent pas avoir leur sortie capturée correctement. Je suis assez ennuyé à la recherche d'un moyen de le faire et 7z.exe est le seul programme que je ne peux pas traiter de cette façon. Le wrapper de Progdigy est très bien, alors j'accepte votre réponse. Merci! – Tom

Questions connexes