2013-07-30 94 views
-3

期間從主目錄中的文件和文件夾,我用這個代碼合併所有文件爲一個從一個目錄,而不是真正的壓縮,德爾福功能,不允許壓縮

procedure CompressDirectory(InDir : string; OutStream : TStream); 
var 
AE : TArchiveEntry; 
procedure RecurseDirectory(ADir : string); 
var 
sr : TSearchRec; 
TmpStream : TStream; 
begin 
if FindFirst(ADir + '*', faAnyFile, sr) = 0 then 
begin 
repeat 
if (sr.Attr and (faDirectory or faVolumeID)) = 0 then 
begin 
// We have a file (as opposed to a directory or anything 
// else). Write the file entry header. 
AE.EntryType := aeFile; 
AE.FileNameLen := Length(sr.Name); 
AE.FileLength := sr.Size; 
OutStream.Write(AE, SizeOf(AE)); 
OutStream.Write(sr.Name[1], Length(sr.Name)); 
// Write the file itself 
TmpStream := TFileStream.Create(ADir + sr.Name, fmOpenRead or fmShareDenyWrite); 
OutStream.CopyFrom(TmpStream, TmpStream.Size); 
TmpStream.Free; 
end; 
if (sr.Attr and faDirectory) > 0 then 
begin 
if (sr.Name <> '.') and (sr.Name <> '..') then 
begin 
// Write the directory entry 
AE.EntryType := aeDirectory; 
AE.DirNameLen := Length(sr.Name); 
OutStream.Write(AE, SizeOf(AE)); 
OutStream.Write(sr.Name[1], Length(sr.Name)); 
// Recurse into this directory 
RecurseDirectory(IncludeTrailingPathDelimiter(ADir + sr.Name)); 
end; 
end; 
until FindNext(sr) <> 0; 
FindClose(sr); 
end; 
// Show that we are done with this directory 
AE.EntryType := aeEOD; 
OutStream.Write(AE, SizeOf(AE)); 
end; 
begin 
RecurseDirectory(IncludeTrailingPathDelimiter(InDir)); 
end; 

如果我想compressDirectory功能沒有什麼包括一些文件夾和文件? CompressDirectory函數代碼的外觀如何?請指導我,謝謝。

> 編輯刪除圖像的空間。

+1

請勿將JPG用於非照片圖像。 –

+0

使用ZIP庫 –

+1

請了解如何正確格式化您的代碼,以使其可讀。如果它在發佈之前看起來很糟糕,那就教你自己正確地縮進代碼,即使只是爲了自己。如果你可以閱讀它,現在調試和排除故障要容易得多,並且在未來維護它(尤其是當你與其他人一起工作或公開發布並要求其他人這樣做時)。如果你不能花時間爲我們設計閱讀格式,那麼我們很難有動力花時間去幫助你實現目標。 –

回答

2

的代碼已經採用技術來跳過某些不需要的文件名:

if (sr.Name <> '.') and (sr.Name <> '..') then 

只需使用同樣的技術來排除你希望的任何其他文件。您可以將排除列表硬編碼到代碼中,就像已經完成的一樣。..名稱,或者您可以將一個名稱列表作爲另一個參數傳遞給該函數。在將文件添加到存檔之前,請檢查該文件名是否在要排除的文件列表中。

例如,如果排除名稱列表是在一個TStrings後代,你可能會使用這樣的:

if ExcludedNames.IndexOf(sr.Name) >= 0 then 
    Continue; // Skip the file because we've been told to exclude it. 

你可以加強這方面的檢查文件的完整路徑,而不是隻在本地名稱。您也可以增強它以支持排除列表中的通配符。

+0

好吧,我用TStringList,添加我不想包含的路徑。讓我檢查你的代碼,謝謝。 – XXXXXXXXXXXXXX

+0

我不太確定把代碼行放在哪裏。 – XXXXXXXXXXXXXX

+3

然後你必須再研究一下你的代碼。我不會爲你做你的工作。確定代碼的哪一部分負責將數據寫入文件。其餘部分負責迭代文件。前者是您想要跳過的部分,因此請在此處進行更改。如果您對代碼的外觀感到非常自豪,那麼可以正確縮進它,這樣可以更容易閱讀。 –