2012-07-27 32 views
5

हम फ़ाइलों को विभिन्न श्रेणियों में बांटा जाता है, कहते हैं कि CatA .. CatD है। प्रत्येक श्रेणी में एक संबंधित फ़ोल्डर होता है जिसे उपयोगकर्ता द्वारा कॉन्फ़िगर किया जा सकता है। उदाहरण के लिए CatAC:\Path\To\CatA पर जाता है, CatBC:\Path\To\CatB और CatC और CatDC:\Path\To\CatCD पर जाएं।VCLZip: ज़िप फ़ाइल में "आभासी" निर्देशिका

अब मैं बैकअप करना चाहते हैं और तरह

[CatA] 
SomeFile.abc 
*.txt 

[CatB] 
File3.xyz 
File4.xyz 
. 
. 
. 

एक विशेष निर्देशों के अनुसार एक ज़िप फ़ाइल से/में इन फ़ाइलों को पुनर्स्थापित जिसके परिणामस्वरूप ज़िप फ़ाइल की तरह

CatA 
    SomeFile.abc 
    aaa.txt 
    bbb.txt 
    ccc.txt 
CatB 
    File3.xyz 
    File4.xyz 
. 
. 
. 

मैं इस कामयाब एक संरचना होनी चाहिए कई काम प्रति Zip और UnZip(Selected) तरीकों और पथ नाम संपत्ति के साथ hackery का एक सा करने के लिए कॉल करके VCLZip साथ। हालांकि मैं Zip/UnZip(Selected) इतना करने के लिए एक कॉल चाहते हैं कि VCLZip अधिक सही समग्र प्रगति की गणना कर सकते हैं और मैं एक कम उछल प्रगति बार मिलता है।

मैं TVCLUnzip.FilesList.Objects गुणों का उपयोग करके "स्थानांतरण" एक OnStartZip हैंडलर में फ़ाइल श्रेणी जानकारी के अनुसार कुछ जहां मैं तो ZipHeader.directory में हेरफेर कर सकते हैं करने के लिए (ab) द्वारा इस लागू करने में सक्षम था, लेकिन यह बहुत जटिल और नाजुक लगता है, इसलिए मुझे आशा है कि एक और सीधा समाधान है जो मैं अभी नहीं देखता हूं। कोई विचार?

+0

के लिए 'OnStartZip' एक उदाहरण आखिरी समय पर पथ को बदलने करता है, और का उल्लेख है जो अन्य गुणों को बदलने के लिए सुरक्षित कर रहे हैं कि है ऑनलाइन मदद करते हैं। केवल बात यह है कि थोड़ा अधिक जटिल है कि आप सही पारित कर दिया फ़ाइल नाम के आधार पर जानकारी वापस हो रही है, और आप पहले से ही है कि हल करने में कामयाब रहे हैं। मैं इसे इस तरह रखूंगा। – hvd

उत्तर

0

आप एक ज़िप कॉल में यह कर सकते हैं। बस TVCLZip.FileList और TVclZIP.ExcludeList

VCLZip.FileList.Add('C:\Path\To\CatA\*.txt'); 
VCLZip.FileList.Add('C:\Path\To\CatA\SomeFile.abc'); 
VCLZip.FileList.Add('C:\Path\To\CatB\File3.xyz'); 
...... 

में भरने और TVCLZip.OnStartZip परिभाषित करते हैं। मैंने अपनी परियोजना में इस रणनीति का उपयोग किया है और यह ठीक काम करता है। उदाहरण के लिए:

procedure TMainForm.VCLZipStartZip(Sender: TObject; FName: String; var ZipHeader: TZipHeaderInfo; var Skip: Boolean); 
var Dest: String; 

begin 
try 
    Dest:=ExtractFilePath(FName); 
    Dest:=StringReplace(Dest,'C:\Path\To\','' ,[rfReplaceAll,rfIgnoreCase]); 
    ZipHeader.directory:=Dest; 
end; 

आप आप एक ज़िप फ़ाइल में स्रोत फ़ाइल फ़ोल्डर होने की जरूरत है किसी भी मूल्य के लिए ZipHeader.directory सेट कर सकते हैं।