web-dev-qa-db-ja.com

C#を使用して単一のファイルを圧縮する

私は.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;"、ディレクトリが無効であるというエラーがスローされます。

26
user3362735

これを機能させる最も簡単な方法は、一時フォルダーを使用することです。

ジッピング用:

  1. 一時フォルダーを作成する
  2. ファイルをフォルダーに移動する
  3. ZIPフォルダ
  4. フォルダーを削除

解凍用:

  1. アーカイブを解凍する
  2. 一時フォルダーから自分の場所にファイルを移動する
  3. 一時フォルダーを削除
7
AlexanderBrevig

アーカイブで 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();
}
42
John Koerner

ファイル(または任意の)ストリームの使用:

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アセンブリを参照する必要があります。

23
ziya

次のコードを使用してファイルを圧縮するだけです。

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());
                        }
                    }
                }
            }
        }

    }
0
Jeetendra Negi

.NETには、単一のファイルに対して、問題に取り組むためのかなり多くの方法があります。そこですべてを学びたくない場合は、SharpZipLib(長年オープンソースライブラリ)、sevenzipsharp(下に7Zipライブラリが必要)、DotNetZipなどの抽象化されたライブラリを入手できます。

0