C# 如何以最大输出大小压缩多个文件,同时保持文件对在一起

C# 如何以最大输出大小压缩多个文件,同时保持文件对在一起,c#,batch-file,zip,cmd,7zip,C#,Batch File,Zip,Cmd,7zip,我如何将文件压缩成单独的压缩文件,总大小不超过一定的大小,同时保持成对的文件在一起 我希望使用带有命令提示符的CLI、批处理文件或一些C#代码来完成此操作。我不在乎是否使用DotNetZip、7Zip或WinZip 一个示例场景是我有一个大目录C:\LargeDirectory,25GB。此目录包含成对的文件。例如File1.pdf和File1.ind。这些对需要在每个zip文件中保持在一起。每个输出zip文件都需要保持在低于2 GB的水平 编辑: 在每个输出zip中,它们将是多对。如果其中一对

我如何将文件压缩成单独的压缩文件,总大小不超过一定的大小,同时保持成对的文件在一起

我希望使用带有命令提示符的CLI、批处理文件或一些C#代码来完成此操作。我不在乎是否使用DotNetZip、7Zip或WinZip

一个示例场景是我有一个大目录C:\LargeDirectory,25GB。此目录包含成对的文件。例如File1.pdf和File1.ind。这些对需要在每个zip文件中保持在一起。每个输出zip文件都需要保持在低于2 GB的水平

编辑:
在每个输出zip中,它们将是多对。如果其中一对将导致输出压缩超过2GB,则它们将被拆分为另一对。

我相信您希望将存档拆分为几个相等的部分。这可以通过使用7-zip和batch来完成

要将存档拆分为相同大小,请执行以下操作:

@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
这将把归档文件分为两个2GB。要提取存档,请执行以下操作:

@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和batch来完成

要将存档拆分为相同大小,请执行以下操作:

@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
这将把归档文件分为两个2GB。要提取存档,请执行以下操作:

@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
有关更多信息,您也可以参阅。希望能有所帮助。

下面是一些C代码,它根据问题中的要求完成这项工作。它将一个文件目录压缩成单独的zip文件,总大小不超过一定的大小,同时将成对的文件放在一起。在本例中,代码中明确说明了这两种文件类型,但可以通过稍微定制使其更通用。

}
更新:提高了算法的速度。

以下是一些C代码,它根据问题中的要求完成任务。它将一个文件目录压缩成单独的zip文件,总大小不超过一定的大小,同时将成对的文件放在一起。在本例中,代码中明确说明了这两种文件类型,但可以通过稍微定制使其更通用。

}

更新:提高了算法的速度。

我重写了dkroy的算法,因为我认为它执行了过多的强制转换,并且查询磁盘的次数过多

现在,它一次加载所有文件信息,让磁盘保持安静,直到我们需要写入zip文件。此外,我还优化了比较,它是在内存上完成的,使用引用而不是每次迭代都创建新对象,还将一些变量更改为标准.NET类型并删除StringBuilder,您可以检查代码:

private void CreateZip(string largeDir、string splitIntoDir、double maxFolderSize)
{
int fileNumber=1;
//我们一次得到所有的PDF和idf文件
FileInfo[]files=newdirectoryinfo(largeDir).GetFiles(“*.pdf”);
FileInfo[]filesPair=newdirectoryinfo(largeDir).GetFiles(“*.idf”);
List toAdd=新列表();
//我们在内存中匹配没有扩展名的文件名,并创建一个匿名对象
//其中将包含这两个文件
var pairs=files.Join(filesPair,f=>Path.GetFileNameWithoutExtension(f.FullName),
idx=>Path.GetFileNameWithoutExtension(idx.FullName),(f,idx)=>new{Pdf=f,Index=idx});
长currentOutputSize=0;
string outputZip=string.Format(“{0}{1}{2}{3}.zip”),splitIntoDir,Path.directoryseportorchar,Path.GetFileName(largeDir),fileNumber);
//迭代与集合匹配的对
foreach(成对变量对)
{
//对当前文件对求和
currentOutputSize+=pair.Pdf.Length+pair.Index.Length;
if(currentOutputSizezip.AddFile(f.FullName,string.Empty));
zip.Save();
}
//我们开始一个新的拉链
toAdd.Clear();
fileNumber++;
currentOutputSize+=pair.Pdf.Length+pair.Index.Length;
foutputZip=string.Format(“{0}{1}{2}{3}.zip”,拆分为dir,Path.directoryseportorchar,Path.GetFileName(largeDir),fileNumber);
//我们添加当前迭代的文件
toAdd.Add(pair.Pdf);
添加(对索引);
}
}
}

我重写了dkroy的算法,因为我认为它执行了过度的强制转换,并且它太频繁地查询磁盘

现在,它一次加载所有文件信息,让磁盘保持安静,直到我们需要写入zip文件。此外,我还优化了比较,它是在内存上完成的,使用引用而不是每次迭代都创建新对象,还将一些变量更改为标准.NET类型并删除StringBuilder,您可以检查代码:

private void CreateZip(string largeDir、string splitIntoDir、double maxFolderSize)
{
int fileNumber=1;
//我们一次得到所有的PDF和idf文件
FileInfo[]files=newdirectoryinfo(largeDir).GetFiles(“*.pdf”);
FileInfo[]filesPair=newdirectoryinfo(largeDir).GetFiles(“*.idf”);
List toAdd=新列表();
//我们在内存中匹配没有扩展名的文件名,并创建一个匿名对象
//其中将包含这两个文件