1

ファイルのペアを一緒に保持しながら、ファイルを合計で特定のサイズ以下の個別の zip ファイルに圧縮するにはどうすればよいですか?

コマンド プロンプト、バッチ ファイル、またはいくつかの C# コードを使用して CLI を使用してこれを実行したいと考えています。DotNetZip、7Zip、WinZip のどれを使用してもかまいません。

サンプル シナリオは、25 GB の大きなディレクトリ C:\LargeDirectory があるとします。このディレクトリには、ペアになっているファイルが含まれています。たとえば、File1.pdf と File1.ind です。これらのペアは、各 zip ファイル内で一緒にする必要があります。各出力 zip ファイルは、2 GB としましょう。

編集:各出力zipで複数のペアになります。ペアの 1 つが 2GB を超える出力 zip になる場合、それらは別のものに分割されます。

4

3 に答える 3

3

質問の要件に基づいてジョブを実行する C# コードを次に示します。ファイルのペアを一緒に保ちながら、ファイルのディレクトリを合計で特定のサイズ以下の個別の zip ファイルに圧縮します。この場合、コードで明示的に明確化された 2 つのファイル タイプですが、もう少しカスタマイズすることで、より一般的なものにすることができます。

private void CreateZip(string largeDir, string splitIntoDir, double maxFolderSize)
{
    int fileNumber = 1;
    List<String> files = new List<String>(Directory.GetFiles(largeDir, "*.pdf"));
    StringBuilder outputZip = new StringBuilder(splitIntoDir + Path.DirectorySeparatorChar + Path.GetFileName(largeDir) + "_" + fileNumber + @".zip");
    double currentOutputSize = 0;
    List<String> toAdd = new List<String>();
    foreach (String file in files)
    {
        if(File.Exists(file) && File.Exists(file.Replace(".pdf", ".idf")))
            currentOutputSize += new FileInfo(file).Length + new FileInfo(file.Replace(".pdf", ".idf")).Length;

    if (currentOutputSize &lt;= maxFolderSize)
    {
        toAdd.AddRange(new String[]{file, file.Replace(".pdf", ".idf")});

    }
    else
    {
        using (ZipFile zip = new ZipFile(outputZip.ToString()))
        {
            foreach(String aFile in toAdd)
                zip.AddFile(aFile, "");
            zip.Save();
        }
        toAdd.Clear();
        fileNumber += 1;
        outputZip.Clear();
        outputZip.Append(splitIntoDir + Path.DirectorySeparatorChar + Path.GetFileName(largeDir) + "_" + fileNumber + @".zip");
        currentOutputSize = new FileInfo(file).Length + new FileInfo(file.Replace(".pdf", ".idf")).Length;
        toAdd.Add(file);
    }
}

}

更新:アルゴリズムの速度を改善しました。

于 2013-02-04T14:28:30.560 に答える
0

アーカイブをいくつかの等しい部分に分割することを望んでいると思います。これは、7-zip とバッチを使用して実行できます。

アーカイブを同じサイズに分割するには:

@echo off
@set "ZipPath=%ProgramFiles%\7-Zip\7z.exe"
@IF NOT EXIST "%ZipPath%" set "ZipPath=%ProgramFiles(x86)%\7-Zip\7z.exe"

"%ZipPath%" a -mx9 -mmt4 -m0=lzma:d27:fb128 -v2g "C:\foo.7z" "C:\LargeDirectory"

PAUSE

これにより、アーカイブがそれぞれ 2 GB の 2 つに分割されます。アーカイブを抽出するには:

@echo off

@set "ZipPath=%ProgramFiles%\7-Zip\7z.exe"
@IF NOT EXIST "%ZipPath%" set "ZipPath=%ProgramFiles(x86)%\7-Zip\7z.exe"

"%ZipPath%" x "-oC:\LargeDirectory" "C:\foo.7z.001"

PAUSE

詳細については、 7-zip コマンドラインも参照してください。それが役に立てば幸い。

于 2013-02-03T10:17:59.417 に答える