2013-08-09 34 views

答えて

5

SevenZipCompressorクラスは、CompressFileDictionary()というメソッドを提供します。 メソッドオーバーロードの1つは、ファイルディクショナリとファイルストリームが必要です。 ファイル辞書は普通の.Net Dictionary<string,string>です。 辞書のキーは、 のファイルの名前(または相対パス)であり、辞書の値はファイルシステム内のファイルへのパスです。

辞書のキーを使用すると、7zアーカイブの構造を制御できます。たとえば あなたは3つのフォルダアーカイブ内

c:\temp\testdir1 
      |- file1.txt 
      |- file2.txt 
c:\temp\testdir2 
      |- file1.txt 
c:\temp2\test 
      |- file3.txt 

し、得られた構造を圧縮したい場合

testdir1 
     |- file1.txt 
     |- file2.txt 
testdir2 
     |- file1.txt 
    test 
     |-file3.txt 

である必要があり、その後、単に次のようにdictonaryにファイルを追加します。

Dictionary<string, string> filesDic = new Dictionary<string, string>(); 

filesDic.Add(@"testdir1\file1.txt", @"c:\temp\testdir1\files1.txt"); 
filesDic.Add(@"testdir1\file2.txt", @"c:\temp\testdir1\files2.txt"); 
filesDic.Add(@"testdir2\file1.txt", @"c:\temp\testdir2\files1.txt"); 
filesDic.Add(@"test\file3.txt", @"c:\temp2\test\files3.txt"); 

以下の例では、このような辞書をフォルダに作成して圧縮するプロセスを自動化する方法を示しています。単一の7zアーカイブファイル。

private static void AddFilesFromDirectoryToDictionary(Dictionary<string, string> filesDictionary, 
    string pathToDirectory) 
{  
    DirectoryInfo dirInfo = new DirectoryInfo(pathToDirectory);  

    FileInfo[] fileInfos = dirInfo.GetFiles("*.*", SearchOption.AllDirectories); 

    foreach (FileInfo fi in fileInfos) 
    {   
    filesDictionary.Add(fi.FullName.Replace(dirInfo.Parent.FullName + "\\", "").ToLower(), 
     fi.FullName); 
    }   
} 

static void Main(string[] args) 
{ 
    // Set path to 7z library. 
    SevenZipCompressor.SetLibraryPath("7z.dll"); 

    using (FileStream fs = new FileStream("c:\\temp\\test.7z", FileMode.Create)) 
    {   
    SevenZipCompressor szc = new SevenZipCompressor 
           { 
            CompressionMethod = CompressionMethod.Lzma, 
            CompressionLevel = CompressionLevel.Normal, 
            CompressionMode = CompressionMode.Create,          
            DirectoryStructure = true, 
            PreserveDirectoryRoot = false, 
            ArchiveFormat = OutArchiveFormat.SevenZip 
           };   

    Dictionary<string, string> filesDictionary = new Dictionary<string, string>(); 

    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir1"); 
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir2"); 
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp2\test"); 

    szc.CompressFileDictionary(filesDictionary, fs);        
    }  
} 

また、次のコード変更を使用してZIPアーカイブを作成することができます。

using (FileStream fs = new FileStream("c:\\temp\\test.zip", FileMode.Create)) 
{   
    SevenZipCompressor szc = new SevenZipCompressor 
      { 
      CompressionMethod = CompressionMethod.Deflate, 
      CompressionLevel = CompressionLevel.Normal, 
      CompressionMode = CompressionMode.Create,          
      DirectoryStructure = true, 
      PreserveDirectoryRoot = false, 
      ArchiveFormat = OutArchiveFormat.Zip 
      };   

    Dictionary<string, string> filesDictionary = new Dictionary<string, string>(); 

    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir1"); 
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp\testdir2"); 
    AddFilesFromDirectoryToDictionary(filesDictionary, @"c:\temp2\test"); 

    szc.CompressFileDictionary(filesDictionary, fs);        
} 
+0

@subirshanを:私の答えの助けをしていますか? – Hans

+0

これは、.zipファイルではなく.7zファイルでのみ有効です。これは正しいです? –

+1

@ MarkRedman:.zipアーカイブを作成することもできます。 .zipアーカイブを作成する方法を示すために私の答えを更新しました。私はまた、AddFilesFromDirectoryToDictionary()関数で小さなバグを修正しました。 – Hans

関連する問題