C#でフォルダーを圧縮する方法の例(単純なコード)とは何ですか?
更新:
名前空間ICSharpCode
が表示されません。私がダウンロードしました ICSharpCode.SharpZipLib.dll
しかし、どこにコピーするかわからないDLLファイル。この名前空間を表示するにはどうすればよいですか?
そして、MSDNのすべてを読みましたが、何も見つかりませんでした。
わかりましたが、次の情報が必要です。
どこにコピーすればよいですかICSharpCode.SharpZipLib.dll
Visual Studioでその名前空間を表示するには?
この答えは.NET 4.5で変わります。 Zipファイルの作成 非常に簡単になります 。サードパーティのライブラリは必要ありません。
string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.Zip";
string extractPath = @"c:\example\extract";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
DotNetZip ヘルプファイルから http://dotnetzip.codeplex.com/releases/
using (ZipFile Zip = new ZipFile())
{
Zip.UseUnicodeAsNecessary= true; // utf-8
Zip.AddDirectory(@"MyDocuments\ProjectX");
Zip.Comment = "This Zip was created at " + System.DateTime.Now.ToString("G") ;
Zip.Save(pathToSaveZipFile);
}
BCLにはこれを行うものは何もありませんが、機能をサポートする.NET用の2つの優れたライブラリがあります。
私は両方を使用しましたが、2つは非常に完全で、適切に設計されたAPIを持っていると言えるので、主に個人的な好みの問題です。
個々のファイルをZipファイルに追加するのではなく、Foldersの追加を明示的にサポートしているかどうかはわかりませんが、再帰的に反復するものを作成するのは非常に簡単です DirectoryInfo
および FileInfo
クラスを使用して、ディレクトリおよびそのサブディレクトリを上書きします。
.NET 4.5では、ZipFile.CreateFromDirectory(startPath、zipPath);この方法は、いくつかのファイルやサブフォルダーをフォルダーに入れずに圧縮するシナリオをカバーしていません。これは、unzipでファイルを現在のフォルダー内に直接配置する場合に有効です。
このコードは私のために働いた:
public static class FileExtensions
{
public static IEnumerable<FileSystemInfo> AllFilesAndFolders(this DirectoryInfo dir)
{
foreach (var f in dir.GetFiles())
yield return f;
foreach (var d in dir.GetDirectories())
{
yield return d;
foreach (var o in AllFilesAndFolders(d))
yield return o;
}
}
}
void Test()
{
DirectoryInfo from = new DirectoryInfo(@"C:\Test");
using (FileStream zipToOpen = new FileStream(@"Test.Zip", FileMode.Create))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
{
foreach (FileInfo file in from.AllFilesAndFolders().Where(o => o is FileInfo).Cast<FileInfo>())
{
var relPath = file.FullName.Substring(from.FullName.Length+1);
ZipArchiveEntry readmeEntry = archive.CreateEntryFromFile(file.FullName, relPath);
}
}
}
}
Zipアーカイブにフォルダーを「作成」する必要はありません。 CreateEntryFromFileの2番目のパラメーター「entryName」は相対パスである必要があり、Zipファイルを解凍すると、相対パスのディレクトリが検出および作成されます。
System.IO.Packaging名前空間には、.NET 3、3.5、および4.0に組み込まれているZipPackageクラスがあります。
http://msdn.Microsoft.com/en-us/library/system.io.packaging.zippackage.aspx
以下に使用方法の例を示します。 http://www.codeproject.com/KB/files/ZipUnZipTool.aspx?display=Print
[〜#〜] msdn [〜#〜] に関する記事があり、純粋にC#でファイルとフォルダーを圧縮および解凍するためのサンプルアプリケーションがあります。私はその中のいくつかのクラスを長い間首尾よく使用してきました。この種のことを知る必要がある場合、コードはMicrosoft Permissive Licenseの下でリリースされます。
EDIT:少し遅れていることを指摘してくれたCheesoに感謝します。私が指摘したMSDNの例は、実際には DotNetZip を使用しており、最近では非常に充実した機能を備えています。これの前のバージョンの私の経験に基づいて、私は喜んでそれをお勧めします。
SharpZipLib も非常に成熟したライブラリであり、人々から高く評価されており、GPLライセンスの下で利用可能です。それは本当にあなたのzip圧縮のニーズと、それぞれのライセンス条件をどう見るかによって異なります。
リッチ
dotNetZipを使用(nugetパッケージとして利用可能):
public void Zip(string source, string destination)
{
using (ZipFile Zip = new ZipFile
{
CompressionLevel = CompressionLevel.BestCompression
})
{
var files = Directory.GetFiles(source, "*",
SearchOption.AllDirectories).
Where(f => Path.GetExtension(f).
ToLowerInvariant() != ".Zip").ToArray();
foreach (var f in files)
{
Zip.AddFile(f, GetCleanFolderName(source, f));
}
var destinationFilename = destination;
if (Directory.Exists(destination) && !destination.EndsWith(".Zip"))
{
destinationFilename += $"\\{new DirectoryInfo(source).Name}-{DateTime.Now:yyyy-MM-dd-HH-mm-ss-ffffff}.Zip";
}
Zip.Save(destinationFilename);
}
}
private string GetCleanFolderName(string source, string filepath)
{
if (string.IsNullOrWhiteSpace(filepath))
{
return string.Empty;
}
var result = filepath.Substring(source.Length);
if (result.StartsWith("\\"))
{
result = result.Substring(1);
}
result = result.Substring(0, result.Length - new FileInfo(filepath).Name.Length);
return result;
}
使用法:
Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest");
または
Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest\output.Zip");
次のコードでは、サードパーティ RebexのZipコンポーネント を使用しています。
// add content of the local directory C:\Data\
// to the root directory in the Zip archive
// (Zip archive C:\archive.Zip doesn't have to exist)
Rebex.IO.Compression.ZipArchive.Add(@"C:\archive.Zip", @"C:\Data\*", "");
または、アーカイブを複数回開いたり閉じたりすることなくフォルダを追加したい場合:
using Rebex.IO.Compression;
...
// open the Zip archive from an existing file
ZipArchive Zip = new ZipArchive(@"C:\archive.Zip", ArchiveOpenMode.OpenOrCreate);
// add first folder
Zip.Add(@"c:\first\folder\*","\first\folder");
// add second folder
Zip.Add(@"c:\second\folder\*","\second\folder");
// close the archive
Zip.Close(ArchiveSaveAction.Auto);
無料のLGPLライセンスを使用する SharpZipLib が一般的な代替手段です。
免責事項:私はRebexで働いています
"Where should I copy ICSharpCode.SharpZipLib.dll to see that namespace in Visual Studio?"
Dllファイルをプロジェクトの参照として追加する必要があります。ソリューションエクスプローラーで[参照設定]を右クリックし、[参照の追加]、[参照]の順にクリックして、dllを選択します。
最後に、使用したいファイルにusingステートメントとして追加する必要があります。
ComponentPro Zip は、そのタスクを達成するのに役立ちます。次のコードスニペットは、フォルダー内のファイルとディレクトリを圧縮します。ウィルカードマスクも使用できます。
using ComponentPro.Compression;
using ComponentPro.IO;
...
// Create a new instance.
Zip zip = new Zip();
// Create a new Zip file.
Zip.Create("test.Zip");
Zip.Add(@"D:\Temp\Abc"); // Add entire D:\Temp\Abc folder to the archive.
// Add all files and subdirectories from 'c:\test' to the archive.
Zip.AddFiles(@"c:\test");
// Add all files and subdirectories from 'c:\my folder' to the archive.
Zip.AddFiles(@"c:\my folder", "");
// Add all files and subdirectories from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2", "22");
// Add all .dat files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2", "22", "*.dat");
// Or simply use this to add all .dat files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2\*.dat", "22");
// Add *.dat and *.exe files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2\*.dat;*.exe", "22");
TransferOptions opt = new TransferOptions();
// Donot add empty directories.
opt.CreateEmptyDirectories = false;
Zip.AddFiles(@"c:\abc", "/", opt);
// Close the Zip file.
Zip.Close();
http://www.componentpro.com/doc/Zip には他の例があります