Nochmal zwei Fragen zum TZipFile (unter FireMonkey):
1.) fmShareDenyNone
Ich habe jetzt einfach TZipFile überschreiben und fmShareDenyNone verwendet.
Delphi-Quellcode:
procedure TZipFile.Add(FileName: string; ArchiveFileName: string;
Compression: TZipCompression);
var
LInStream: TStream;
LHeader: TZipHeader;
begin
if not (FMode in [zmReadWrite, zmWrite]) then
raise EZipException.CreateRes(@SZipNoWrite);
if not FCompressionHandler.ContainsKey(Compression) then
raise EZipException.CreateResFmt(@SZipNotSupported, [
TZipCompressionToString(Compression) ]);
// Setup Header
FillChar(LHeader, sizeof(LHeader), 0);
LHeader.Flag := 0;
LInStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); // FIXED fmOpenRead);
try
LHeader.Flag := 0;
LHeader.CompressionMethod := UInt16(Compression);
LHeader.ModifiedDateTime := DateTimeToFileDate( tfile.GetLastWriteTime(FileName) );
LHeader.UncompressedSize := LInStream.Size;
LHeader.InternalAttributes := 0;
LHeader.ExternalAttributes := 0;
if ArchiveFileName = '' then
ArchiveFileName := ExtractFileName(FileName);
if FUTF8Support then
LHeader.Flag := LHeader.Flag or (1 SHL 11); // Language encoding flag, UTF8
LHeader.FileName := StringToTBytes(ArchiveFileName);
LHeader.FileNameLength := Length(LHeader.FileName);
LHeader.ExtraFieldLength := 0;
Add(LInStream, LHeader);
finally
LInStream.Free;
end;
end;
Auf den ersten Blick scheint das so alles zu funktionieren. Jedenfalls kann ich die laufende ProjektExe somit selbst packen.
Kennt jemand plausible Gründe, warum Emba das nicht entsprechend geregelt hat?
2.) Umlaute
Das Zippen von kompletten Ordnern funktioniert eigentlich gut. Ich habe aber ein Problem mit Umlauten in Dateinamen festgestellt (siehe Screenshot).
Weiß jemand Abhilfe?