私は.NET 4.5を使用していますが、「CreateFromDirectory」を使用してディレクトリ全体を圧縮しようとすると、ZipFileクラスはうまく機能します。ただし、ディレクトリ内の1つのファイルのみを圧縮します。特定のファイル(folder\data.txt)をポイントしようとしましたが、うまくいきません。 「CreateEntryFromFile」メソッドがあるため、ZipArchiveクラスを検討しましたが、既存のファイルにエントリを作成することしかできないようです。
空のzipファイル(問題がある)を作成せずにZipArchiveExtensionの "CreateEntryFromFile"メソッドを使用せずに、1つのファイルを単純に圧縮する方法はありませんか?
**これは、現在サードパーティのアドオンを使用できない会社のプログラムに取り組んでいると仮定しています。
例: http://msdn.Microsoft.com/en-us/library/ms404280%28v=vs.110%29.aspx
string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.Zip";
string extractPath = @"c:\example\extract";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
ただし、startPathが@"c:\example\start\myFile.txt;"
、ディレクトリが無効であるというエラーがスローされます。
これを機能させる最も簡単な方法は、一時フォルダーを使用することです。
ジッピング用:
解凍用:
アーカイブで CreateEntryFromFile を使用し、ファイルまたはメモリストリームを使用します。
Zipファイルを作成してから追加する場合は、ファイルストリームを使用します。
using (FileStream fs = new FileStream(@"C:\Temp\output.Zip",FileMode.Create))
using (ZipArchive Arch = new ZipArchive(fs, ZipArchiveMode.Create))
{
Arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}
または、メモリ内ですべてを実行し、完了したらファイルを書き込む必要がある場合は、メモリストリームを使用します。
using (MemoryStream ms = new MemoryStream())
using (ZipArchive Arch = new ZipArchive(ms, ZipArchiveMode.Create))
{
Arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}
次に、 MemoryStreamをファイルに書き込む を実行できます。
using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) {
byte[] bytes = new byte[ms.Length];
ms.Read(bytes, 0, (int)ms.Length);
file.Write(bytes, 0, bytes.Length);
ms.Close();
}
ファイル(または任意の)ストリームの使用:
using (var Zip = ZipFile.Open("file.Zip", ZipArchiveMode.Create))
{
var entry = Zip.CreateEntry("file.txt");
entry.LastWriteTime = DateTimeOffset.Now;
using (var stream= File.OpenRead(@"c:\path\to\file.txt"))
using (var entryStream = entry.Open())
stream.CopyTo(entryStream);
}
または簡単に:
// reference System.IO.Compression
using (var Zip = ZipFile.Open("file.Zip", ZipArchiveMode.Create))
Zip.CreateEntryFromFile("file.txt", "file.txt");
system.IO.Compressionへの参照を必ず追加してください
更新
また、 ZipFile および ZipArchive の新しいドットネットAPIドキュメントも確認してください。いくつかの例があります。 System.IO.Compression.FileSystem
を参照してZipFile
を使用することに関する警告もあります。
ZipFileクラスを使用するには、プロジェクトでSystem.IO.Compression.FileSystemアセンブリを参照する必要があります。
次のコードを使用してファイルを圧縮するだけです。
public void Compressfile()
{
string fileName = "Text.txt";
string sourcePath = @"C:\SMSDBBACKUP";
DirectoryInfo di = new DirectoryInfo(sourcePath);
foreach (FileInfo fi in di.GetFiles())
{
//for specific file
if (fi.ToString() == fileName)
{
Compress(fi);
}
}
}
public static void Compress(FileInfo fi)
{
// Get the stream of the source file.
using (FileStream inFile = fi.OpenRead())
{
// Prevent compressing hidden and
// already compressed files.
if ((File.GetAttributes(fi.FullName)
& FileAttributes.Hidden)
!= FileAttributes.Hidden & fi.Extension != ".gz")
{
// Create the compressed file.
using (FileStream outFile =
File.Create(fi.FullName + ".gz"))
{
using (GZipStream Compress =
new GZipStream(outFile,
CompressionMode.Compress))
{
// Copy the source file into
// the compression stream.
inFile.CopyTo(Compress);
Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
fi.Name, fi.Length.ToString(), outFile.Length.ToString());
}
}
}
}
}
}
.NETには、単一のファイルに対して、問題に取り組むためのかなり多くの方法があります。そこですべてを学びたくない場合は、SharpZipLib(長年オープンソースライブラリ)、sevenzipsharp(下に7Zipライブラリが必要)、DotNetZipなどの抽象化されたライブラリを入手できます。