2013-07-30 67 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

然后你必须再研究一下你的代码。我不会为你做你的工作。确定代码的哪一部分负责将数据写入文件。其余部分负责迭代文件。前者是您想要跳过的部分,因此请在此处进行更改。如果您对代码的外观感到非常自豪,那么可以正确缩进它,这样可以更容易阅读。 –