Hello,
thank you for creating and maintaining this great component.
But we have problem with zip archive creation:
Options: [soStripDrive, soRemoveDots, soReplace, soRecurse, soStripPath]
BaseDirectory: \computer\sharedfolder\subfolder1
SearchAttr: faAnyFile - faSysFile - faHidden
FileMask: 4 items:
\computer\sharedfolder\subfolder1\subfolder2\fileA.extA;
\computer\sharedfolder\subfolder1*.*
coplete folder and file structure:
\computer\sharedfolder\subfolder1\subfolder2\fileA.extA;
\computer\sharedfolder\subfolder1\subfolder3\fileB.extB;
soRecurse (AddFilesEx -> CreateItems -> AbFindFilesEx ->) causes that AbFindFiles append after file
\computer\sharedfolder\subfolder1\subfolder2\fileA.extA
also theretical files
\computer\sharedfolder\subfolder1\subfolder2*subfolders*
is this correct, when the fileA.extA is not directory?
for \computer\sharedfolder\subfolder1*.* in AbArcTyp.AddFilesEx -> AbArcTyp.CreateItems -> AbFindFilesEx -> AbFindFiles -> FindFirst finds:
'.' (ignored)
'..' (ignored)
'subfolder2' added as \computer\sharedfolder\subfolder1\subfolder2\
'subfolder3' added as \computer\sharedfolder\subfolder1\subfolder3\
with soRecurse still on it goes to recursion call of AbFindFiles with \computer\sharedfolder\subfolder1\subfolder2*. and after that one more recursion call with \computer\sharedfolder\subfolder1\subfolder3*.
First recursion of AbFindFiles with \computer\sharedfolder\subfolder1\subfolder2*.* adds once more file
\computer\sharedfolder\subfolder1\subfolder2\fileA.extA;
so in FileList : TStrings is after AbFindFilesEx ends:
\computer\sharedfolder\subfolder1\subfolder2\fileA.extA
\computer\sharedfolder\subfolder1\subfolder2\
\computer\sharedfolder\subfolder1\subfolder3\
\computer\sharedfolder\subfolder1\subfolder2\fileA.extA (first recursion for subfolder2)
\computer\sharedfolder\subfolder1\subfolder2\fileA.extA (second recursion for subfolder3)
in TAbZipArchive.FixName ( <- TAbZipArchive.CreateItem <- AbArcTyp.CreateItems <- AbArcTyp.AddFilesEx )
soStripDrive makes lValue "subfolder1\subfolder2\fileA.extA"
soStripPath makes lValue like ExtractFileName "fileA.extA"
this value is used for set of TAbZipItem.FileName
in TAbArchive.Add is FileName (TAbArchiveItem) used like Hashkey, but for FileList from above we have hashkeys:
fileA.extA
(empty)
(empty) -- duplicate 1
fileA.extA -- duplicate 2
fileB.extB
Dulpicate 1 makes zip archive saved prematuraly (TAbArchive.Add -> TAbArchive.Replace -> TAbArchive.ReplaceAt -> TAbArchive.SaveIfNeeded), is this correct, when the archive even don't exists?
Dulpicate 2 corupt DiskFileName property from
\computer\sharedfolder\subfolder1\subfolder2\fileA.extA
to
\computer\sharedfolder\subfolder1\fileA.extA
(in TAbArchive.ReplaceAt -> TAbArchive.GetFreshenTarget:1736 :
if (BaseDirectory <> '') then DName := AbAddBackSlash(BaseDirectory) + Item.FileName
)
and that file doesn't exists, so when tro Save is called. I don't fully understand why is BaseDirectory used, but when soStripPath is set, than BaseDirectory + Item.FileName is illegal, while FileName is corrupted.
Another case:
AbArcTyp:1103
if (AbAddBackSlash(FBaseDirectory) + Files[i]) <> FArchiveName
when Files[i] is absolute path have no meaining, and also it schould be case insensitive compare (on windows), and also FArchiveName can be relative path ?
Best Wishes
Radek
Abbrevia version 5.2 rev 539