最近做一个发送Email的小工具,里面有个附件的功能,
如果附件太大了,一般都是用winara 分卷压缩的,然后在上传。
如何用程序来实现自动的分卷压缩的呢?因为RAR不是免费的,就上网找了7z
安装好7z,把7z.dll拷贝到程式的目录下,引用SevenZipSharp这个DLL
引进 using SevenZip.Sdk.Compression;
using SevenZip; 这两个命名空间
代码
/// <summary>
/// 切割文件,当文件的大小大于配置文件的容量中,就切割文件
/// </summary>
/// <param name="filePath"> User下PDF文件的路径eg User/2000/01/01/xxxx.pdf</param>
/// <param name="descDecPath">User/2000/01/01/temp</param>
/// <returns></returns>
public bool SplitFile(string filePath,string descDecPath)
{
FileInfo fInfo = new FileInfo(filePath);
string copyFilePath = Path.Combine(descDecPath, fInfo.Name);
//if (fInfo.Length <= this.fileSize) return false;
if (!Directory.Exists(descDecPath))
{
Directory.CreateDirectory(descDecPath);
}
File.Copy(filePath, copyFilePath);
Application.DoEvents();
SevenZipCompressor tmp = new SevenZipCompressor();
SevenZipCompressor.SetLibraryPath(Application.StartupPath + "/7z.dll");
//tmp.VolumeSize =fInfo.Length <= this.fileSize ? 0 :this.fileSize;
tmp.VolumeSize = this.fileSize;//卷的大小,最大只能分离1000个文件
tmp.ArchiveFormat = OutArchiveFormat.SevenZip;
tmp.CompressDirectory(descDecPath,copyFilePath );
File.Delete(copyFilePath);// 删除Copy的文件
if (Directory.GetFiles(descDecPath).Length == 1)
{
foreach (string path in Directory.GetFiles(descDecPath))
{
File.Delete(path);
}
tmp.VolumeSize = 0;
tmp.CompressFiles(copyFilePath+".7z" ,
new string[] { filePath });//压缩文件
}
Application.DoEvents();
return true;
}
/// 切割文件,当文件的大小大于配置文件的容量中,就切割文件
/// </summary>
/// <param name="filePath"> User下PDF文件的路径eg User/2000/01/01/xxxx.pdf</param>
/// <param name="descDecPath">User/2000/01/01/temp</param>
/// <returns></returns>
public bool SplitFile(string filePath,string descDecPath)
{
FileInfo fInfo = new FileInfo(filePath);
string copyFilePath = Path.Combine(descDecPath, fInfo.Name);
//if (fInfo.Length <= this.fileSize) return false;
if (!Directory.Exists(descDecPath))
{
Directory.CreateDirectory(descDecPath);
}
File.Copy(filePath, copyFilePath);
Application.DoEvents();
SevenZipCompressor tmp = new SevenZipCompressor();
SevenZipCompressor.SetLibraryPath(Application.StartupPath + "/7z.dll");
//tmp.VolumeSize =fInfo.Length <= this.fileSize ? 0 :this.fileSize;
tmp.VolumeSize = this.fileSize;//卷的大小,最大只能分离1000个文件
tmp.ArchiveFormat = OutArchiveFormat.SevenZip;
tmp.CompressDirectory(descDecPath,copyFilePath );
File.Delete(copyFilePath);// 删除Copy的文件
if (Directory.GetFiles(descDecPath).Length == 1)
{
foreach (string path in Directory.GetFiles(descDecPath))
{
File.Delete(path);
}
tmp.VolumeSize = 0;
tmp.CompressFiles(copyFilePath+".7z" ,
new string[] { filePath });//压缩文件
}
Application.DoEvents();
return true;
}
由于没有文件的分卷压缩的类库,所以我求其次,用文件夹的分卷压缩,先把文件copy到一个临时的文件夹中,然后对这个临时的文件夹进行分卷压缩
见代码: