1,10 → 1,8 |
unit ExtractorMain; |
|
{$DEFINE DEBUG_MODE} |
|
{$DEFINE USE_DZIP_UNPACK} |
|
// TODO: Implement ExtractionTarget switch |
// todo: compilerswitch, der auch selectdirectory() anzeigt (ohne foldercreate) |
|
interface |
|
11,7 → 9,7 |
uses |
Windows, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ShellAPI, |
ExtCtrls, ComCtrls, ZipMstr19, ZMMsgStr19, ZMMsg19, ZMDelZip19, |
ZMCompat19, SFXBehavior; |
ZMCompat19, SFXBehavior, ShlObj; |
|
type |
TOverwriteDecision = (odUndefined, odOverwriteAll, odOverwriteNothing); |
150,11 → 148,13 |
s: string; |
ec: Integer; |
ar: TExecuteSFXAutoRunResult; |
GeneralBaseDir: string; |
resourcestring |
Lng_Aborted = 'Der laufende Prozess wurde abgebrochen. Das extrahierten Dateien sind somit unvollständig.'; |
Lng_Zip_Error = 'ZIP-Master Fehler "%s" (%d)'; |
Lng_AutoRunFailed = 'SFX-AutoRun fehlgeschlagen. Die entpackten Inhalte werden nun angezeigt.'; |
Lng_Unknown_Error = 'Unbekannter Fehler: Dateien sind nicht aufzufinden!'; |
Lng_SelectDir = 'Bitte wählen Sie ein Verzeichnis zum Extrahieren aus. Es wird maximal 1 Datei bzw. Ordner erstellt!'; |
begin |
AZipfile := ExpandUNCFileName(AZipfile); |
RenamingOldPrefix := ''; |
184,10 → 184,34 |
uz.OnCheckTerminate := ArcCheckTerminate; |
uz.OnPasswordError := ArcPassword; |
uz.PasswordReqCount := MaxTries; |
// TODO: Mehr events? |
uz.OnSkipped := SkipEvent; |
uz.OnSetExtName := ArcExtFNChange; |
// TODO: Mehr events? |
|
// Find out base dirtory |
|
GeneralBaseDir := ''; |
case zb.ExtractionTarget of |
etExtractHere: |
begin |
GeneralBaseDir := ExtractFilePath(AZipfile); // Default |
end; |
etDesktop: |
begin |
GeneralBaseDir := GetSpecialFolderPath(CSIDL_DESKTOP); |
end; |
etAsk: |
begin |
if not AdvSelectDirectory(Lng_SelectDir, '', GeneralBaseDir, False, False, True) then |
begin |
Exit; |
end; |
end; |
end; |
GeneralBaseDir := IncludeTrailingPathDelimiter(GeneralBaseDir); |
|
// Semantic scanning of ZIP to determinate the final extraction directory |
|
l := TStringList.Create; |
try |
// Count the root objects (files OR dirs) in the ZIP |
202,23 → 226,25 |
else if l.Count = 1 then |
begin |
// 1 Object = Extract it right here! |
s := ExtractFilePath(AZipfile) + l.Strings[0]; |
BaseDir := ExtractFilePath(AZipfile); |
RenamingOldPrefix := StripBaseDir(S); |
BaseDir := GeneralBaseDir; |
s := BaseDir + l.Strings[0]; |
|
RenamingOldPrefix := l.Strings[0]; // = StripBaseDir(S); |
|
if zb.ConflictBehavior = cbAvoid then |
begin |
s := SearchNextFreeName(s); |
s := SearchNextFreeName(s, LooksLikeDir(s)); |
end; |
// TODO: helloworld.exe schlägt fehl! |
RenamingNewPrefix := StripBaseDir(S); // We need to change the name! |
|
RenamingNewPrefix := StripBaseDir(s); |
end |
else |
begin |
// 2+ Objects = Extract them in a separate folder |
s := ChangeFileExt(AZipfile, ''); |
s := GeneralBaseDir + ExtractFileNameWithoutExt(AZipfile) + PathDelim; |
if zb.ConflictBehavior = cbAvoid then |
begin |
s := SearchNextFreeName(s); |
s := SearchNextFreeName(s, true); |
MkDir(s); |
end |
else |
229,7 → 255,7 |
end; |
BaseDir := IncludeTrailingPathDelimiter(BaseDir); |
|
uz.ExtrBaseDir := BaseDir; // TODO: andere ordner erlauben |
uz.ExtrBaseDir := BaseDir; |
|
// Pre-Extract-Dialog |
|
329,8 → 355,7 |
var FileName: TZMString; const BaseDir: TZMString; |
var IsChanged: Boolean); |
begin |
if RenamingOldPrefix = RenamingOldPrefix then Exit; |
|
if RenamingOldPrefix = RenamingNewPrefix then Exit; |
FileName := RenamingNewPrefix + Copy(FileName, 1+Length(RenamingOldPrefix), Length(FileName)-Length(RenamingOldPrefix)); |
IsChanged := true; |
end; |
451,9 → 476,6 |
resourcestring |
Lng_Extracting = 'Extrahiere Dateien. Bitte warten...'; |
begin |
{$IFDEF DEBUG_MODE} |
Caption := Caption + ' (Debug)'; |
{$ENDIF} |
WaitLabel.Caption := Lng_Extracting; |
WaitLabel.Left := progressBar.Width div 2 - WaitLabel.Width div 2; |
CurrentFileLabel.Caption := ''; |
500,6 → 522,10 |
{$ENDIF} |
|
procedure TMainForm.AutoTimerTimer(Sender: TObject); |
resourcestring |
Lng_NakedSFX = 'Das selbstentpackende Archiv (SFX) beschädigt oder ungültig. Wenn Sie diese Datei aus dem Internet bezogen haben, laden Sie sie bitte erneut herunter.'; |
Lng_FileNotFound = 'Die durch Parameter angegebene Datei "%s" kann nicht gefunden werden!'; |
Lng_TooManyArguments = 'Zu viele Argumente!'; |
begin |
AutoTimer.Enabled := false; |
|
508,7 → 534,21 |
{$ENDIF} |
|
try |
{$IFDEF DEBUG_MODE} |
if IsExtractable(ParamStr(0)) then |
begin |
ExtractZipHere(ParamStr(0)); |
end |
else |
begin |
// Der Extractor ist "nackt" oder das SFX beschädigt |
|
if ParamCount = 0 then |
begin |
MessageDlg(Lng_NakedSFX, mtError, [mbOk], 0); |
end |
else if ParamCount = 1 then |
begin |
// In diesem Zustand erlauben wir, fremde SFX zu entpacken (auch für Debugging-Zwecke) |
if FileExists(ParamStr(1)) then |
begin |
ExtractZipHere(ParamStr(1)); |
515,15 → 555,17 |
end |
else |
begin |
{$ENDIF} |
|
ExtractZipHere(ParamStr(0)); |
|
{$IFDEF DEBUG_MODE} |
MessageDlg(Lng_FileNotFound, mtError, [mbOk], 0); |
end; |
{$ENDIF} |
end |
else if ParamCount = 2 then |
begin |
// Future: Mehr als nur 1 Parameter erlauben? |
MessageDlg(Lng_TooManyArguments, mtError, [mbOk], 0); |
end; |
end; |
finally |
AbortUnzip := true; // Damit es zu keiner Abfrage kommt |
AbortUnzip := true; // Damit es zu keiner Abfrage in OnCloseQuery kommt |
Close; |
end; |
end; |