2017-02-10 10 views
1

私はいくつかのフォルダを持っており、各フォルダにはファイル数があります。 異なるフォルダからいくつかのファイルパスを取得しています。これらのファイルを1つのzipファイルに圧縮する必要があります。C# - ファイルパスのリストからZIPファイルを作成

私は単一のフォルダ内のファイルを持っている場合、私は

string startPath = @"c:\example\start";//folder to add 
string zipPath = @"c:\example\result.zip";//URL for your ZIP file 
ZipFile.CreateFromDirectory(startPath, zipPath, CompressionLevel.Fastest, true); 
string extractPath = @"c:\example\extract";//path to extract 
ZipFile.ExtractToDirectory(zipPath, extractPath); 
using (ZipArchive newFile = ZipFile.Open(zipName, ZipArchiveMode.Create)) 
{ 
    foreach (string file in Directory.GetFiles(myPath)) 
    { 
     newFile.CreateEntryFromFile(file); 
    } 
} 

を使用したzipを行うことができますが、私は私が通過するforeachする必要がある、私は唯一のファイルパスのリストを持って、フォルダのことは知らないと仮定します各ファイルのパスとzipに追加します。これに対して私は何をすべきですか?

答えて

2

あなたは、ディレクトリ内のすべてのファイルを列挙することができますがDirectory.GetFilesオーバーロードとSearchOption.AllDirectoriesオプションとサブディレクトリが含まれており、それが

String[] allfiles = System.IO.Directory.GetFiles("myPath", "*.*", System.IO.SearchOption.AllDirectories); 
foreach (string file in allfiles) 
{ 
    newFile.CreateEntryFromFile(file); 
} 

あなたはあまりにもワンステップでアーカイブを作成するZipFile.CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName)またはその過負荷を使用することができます。

また、Path.GetDirectoryName()メソッドを使用して、より柔軟にzipアーカイブ構造を操作する方法があります。次に例を示します。

foreach(var filePath in files) 
{ 
    var directory = Path.GetDirectoryName(filePath); 
    var fileName = Path.GetFileName(filePath); 
    var entry = archive.GetEntryFromFile(filePath, $"{directory}/{fileName}"); 
} 

最後に、あなたは、サードパーティのライブラリDotNetZipを使用すると、コードのわずか3行でヨールシナリオを解決することができます:

using (ZipFile zip = new ZipFile()) 
{ 
    zip.AddFiles(files); 
    zip.Save("Archive.zip"); 
} 
+0

そのないサブdirectriesに関する仕事をしたりしません私はどのようにジップを作成できますか? –

+0

@hildasonicaはyor問題を理解できません。 [CreateEntryFromFile](https://msdn.microsoft.com/en-us/library/hh485720(v = vs.110).aspx)は、2番目のパラメータでアーカイブ内のファイル名を操作できます。フォルダ構造のコピーが必要な場合は、それを無視するか、必要に応じてソースファイルpathesを変更することができます。 –

+0

上記のコードでは、GetFilesというメソッドを使用して、規則的なフォルダからすべてのファイルを取得しています。私の場合、データベースから取得するファイルパスのリストが表示されます。これらのファイルパス(またはfieurl)を使用して、私はzipを作成する必要がある、私はここでGetFiles()メソッドを使用することができないと思う。 –

1

newgetマネージャからDotNetZipライブラリを使用して、ちょうどかどうかを確認しますそれだけで、それはあなたがこの配列から[「\ folder1の\ auditnew.JPG」、「\フォルダ2 \ audi.JPG」]のようなファイルパスの配列を持っていること聞かせて、

using (ZipFile zip = new ZipFile()) 
{ 
    foreach(var filestring in AllFileArray) 
    { 
     zip.AddFile(filestring); 
    } 
    zip.save("MyZipFile.zip") 
}