質問の要件に基づいてジョブを実行する 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 <= 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);
}
}
}
更新:アルゴリズムの速度を改善しました。