6

まず第一に、これに対する解決策を探してみましたが、解凍してフォルダーを追加してから再度圧縮する必要のない解決策が見つかりませんでした。私はサードパーティのライブラリを使用していません。可能であればsystem.io.compressionを使用してこれを行いたいです...そうでない場合は、最後の手段としてdotnetzipを使用します。

TL;DR。ファイルを含むディレクトリを、作成済みの zip ファイルに追加できるようにしたいと考えています。System.Io.Compressionこれはライブラリを使用して可能ですか?

編集

using (FileStream zipToOpen = new FileStream(zipfile, FileMode.Open))
{
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
    {
        ZipArchiveEntry readmeEntry = archive.CreateEntry("testFolder/");
    }
}

したがって、このコードを使用して内部にフォルダーを作成できますが、その中にファイルはありません。私の質問は、このコードをもう一度実行して、すべてのファイルをソース フォルダーから zip 内のこのフォルダーに移動する必要があるか、それとももっと良い方法があるかということです。

4

3 に答える 3

7

@stuartd のおかげで、これを行う方法を見つけることができました。彼は私にこの答えを指摘しましたhttps://stackoverflow.com/a/22339337/3182972 そして、上記のディレクトリのソースの場所からファイルを含むディレクトリを作成するコードにそれを実装する方法を見つけました。

コードは次のとおりです。

   using (FileStream zipToOpen = new FileStream("c:\MyDestination\test.zip", FileMode.Open))
      {
        using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
          {
             ZipArchiveEntry readmeEntry;
             DirectoryInfo d = new DirectoryInfo(c:\MySourceFolder);
             FileInfo[] Files = d.GetFiles("*");
             foreach (FileInfo file in Files)
             {
               readmeEntry = archive.CreateEntryFromFile("c:\MySourceFolder"+ "\\" + file.Name, "MySourceFolder" + "/" + file.Name);
             }
          }
      }

そこで私がしたことは、ソース ディレクトリに移動し、そこにあるすべてのファイルを調べて、foreach サイクルでそれらを zip ファイルの宛先フォルダーに追加することでした。

次のコードでソース ディレクトリ名を取得することもできます。

string sourcepath = "C:\MySourceFolder";
int ind = sourcepath.LastIndexOf("\\") + 1;
string folderName = sourcepath.Substring(ind, folder.Length - ind);
于 2016-07-22T13:26:42.687 に答える
1

これは次の方法で実行できます。

var targetDir = @"D:\test";
var zipFile = @"D:\test.zip"; 
using (ZipArchive zipArchive = ZipFile.Open(zipFile, ZipArchiveMode.Read)) 
      zipArchive.AddDirectory(targetDir, "test");



public static class ExtensionMethods;
    {

        public static void AddDirectory(this ZipArchive zip, string targetDir, string subDir = null, CompressionLevel compressionLevel = CompressionLevel.Optimal)
        {
            var ogrDir = targetDir.Replace("/", "\\");
            if (!ogrDir.EndsWith("\\"))
                ogrDir = ogrDir + "\\";

            if (subDir == null)
                subDir = "";
            else
            {
                subDir = subDir.Replace("/", "\\");
                if (subDir.StartsWith("\\"))
                    subDir = subDir.Remove(0, 1);

                if (!subDir.EndsWith("\\"))
                    subDir = subDir + "\\";
            }
            Action<string> AddDirectoryAndSubs = null;
            AddDirectoryAndSubs = delegate (string _targetDir)
            {
                string[] files = Directory.GetFiles(_targetDir);
                foreach (string file in files)
                {
                    var fileInfo = new FileInfo(file);
                    zip.CreateEntryFromFile(fileInfo.FullName, subDir + (fileInfo.Directory.ToString() + "\\").Replace(ogrDir, "") + fileInfo.Name, compressionLevel);
                }

                string[] dirs = Directory.GetDirectories(_targetDir);
                foreach (string dir in dirs)
                    AddDirectoryAndSubs(dir);
            };

            AddDirectoryAndSubs(targetDir);
        }

    }
于 2018-12-10T08:04:15.400 に答える