在工作中,RAR和ZIP是两种最常用的压缩文件格式,主要用于文件打包、压缩和传输。它们能显著减少文件体积、提高存储效率,并便于数据共享和备份。 文件压缩与存储优化:通过算法减小文件体积,节省磁盘空间或网络带宽。
数据传输与共享:加快文件上传/下载速度,降低传输失败风险。
文件加密与安全:通过密码保护敏感数据,防止未授权访问。
分卷压缩(大文件拆分):将大文件分割成多个小包,绕过存储或传输限制。
自解压文件(无需解压软件):生成自己的.exe应用程序,方便接收方直接运行解压。
1、调用Winrar.exe压缩工具创建rar或zip压缩文件;本方法借助于Winrar.exe工具压缩、解压RAR、ZIP文件;bool RetState = false;
string SourceFileDir = "数据源目录";
string SaveZipFilePath = "rar\zip文件路径";
string SaveFileDir = "解压目录";
CompressRarOrZip(SourceFileDir, SaveZipFilePath, false, "123");
public bool CompressRarOrZip(string SourceFilesPath, string RarSaveFilePath, bool IsCover, string PassWord)
{
string rarPath = Path.GetDirectoryName(RarSaveFilePath);
if (!Directory.Exists(rarPath))
Directory.CreateDirectory(rarPath);
Process Process1 = new Process();
Process1.StartInfo.FileName = "Winrar.exe";
Process1.StartInfo.CreateNoWindow = true;
string cmd = "";
if (!string.IsNullOrEmpty(PassWord) && IsCover)
cmd = string.Format(" a -ep1 -p{0} -o+ {1} {2} -r", PassWord, RarSaveFilePath, SourceFilesPath);
else if (!string.IsNullOrEmpty(PassWord) && !IsCover)
cmd = string.Format(" a -ep1 -p{0} -o- {1} {2} -r", PassWord, RarSaveFilePath, SourceFilesPath);
else if (string.IsNullOrEmpty(PassWord) && IsCover)
cmd = string.Format(" a -ep1 -o+ {0} {1} -r", RarSaveFilePath, SourceFilesPath);
else
cmd = string.Format(" a -ep1 -o- {0} {1} -r", RarSaveFilePath, SourceFilesPath);
Process1.StartInfo.Arguments = cmd;
Process1.Start();
Process1.WaitForExit();
if (Process1.ExitCode == 0)
{
Process1.Close();
return true;
}
else
{
Process1.Close();
return false;
}
}
DecompressRarOrZip(SaveFileDir, SaveZipFilePath, false, "123");
public bool DecompressRarOrZip(string FileSaveDir, string RarFilePath, bool IsCover, string PassWord)
{
if (!Directory.Exists(FileSaveDir))
Directory.CreateDirectory(FileSaveDir);
Process Process1 = new Process();
Process1.StartInfo.FileName = "Winrar.exe";
Process1.StartInfo.CreateNoWindow = true;
string cmd = "";
if (!string.IsNullOrEmpty(PassWord) && IsCover)
cmd = string.Format(" x -p{0} -o+ {1} {2} -y", PassWord, RarFilePath, FileSaveDir);
else if (!string.IsNullOrEmpty(PassWord) && !IsCover)
cmd = string.Format(" x -p{0} -o- {1} {2} -y", PassWord, RarFilePath, FileSaveDir);
else if (IsCover)
cmd = string.Format(" x -o+ {0} {1} -y", RarFilePath, FileSaveDir);
else
cmd = string.Format(" x -o- {0} {1} -y", RarFilePath, FileSaveDir);
Process1.StartInfo.Arguments = cmd;
Process1.Start();
Process1.WaitForExit();
if (Process1.ExitCode == 0)
{
Process1.Close();
return true;
}
else
{
Process1.Close();
return false;
}
}
2、使用三方类库ICSharpCode.SharpZipLib创建ZIP压缩文件:特点:不依赖于PC是否有Winrar.exe压缩工具,引用动态库DLL创建,请自行下载DLL引用文件:ICSharpCode.SharpZipLib.dll bool RetState = false;
string SourceFileDir = "数据源目录";
string SaveZipFilePath = "zip文件路径";
string SaveFileDir = "解压目录";
CreateZipFile(SourceFileDir, SaveZipFilePath);
public bool CreateZipFile(string SourceFileDir, string SaveZipFilePath, bool IsShowDialog = false)
{
bool RetState = false;
try
{
var len = SourceFileDir.Length;
var strlen = SourceFileDir[len - 1];
if (SourceFileDir[SourceFileDir.Length - 1] != Path.DirectorySeparatorChar)
{
SourceFileDir += Path.DirectorySeparatorChar;
}
ZipOutputStream outstream = new ZipOutputStream(File.Create(SaveZipFilePath));
outstream.SetLevel(6);
if (IsShowDialog)
{
frm_CreateZipFile frm = new frm_CreateZipFile(SourceFileDir, outstream, SaveZipFilePath);
frm.ShowDialog();
}
else
{
zip(SourceFileDir, outstream, SourceFileDir);
}
outstream.Finish();
outstream.Close();
RetState = true;
}
catch (Exception)
{
RetState = false;
}
return RetState;
}
private bool zip(string strFile, ZipOutputStream outstream, string staticFile)
{
bool RetState = false;
try
{
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
{
strFile += Path.DirectorySeparatorChar;
}
Crc32 crc = new Crc32();
string[] filenames = Directory.GetFileSystemEntries(strFile);
foreach (string file in filenames)
{
if (Directory.Exists(file))
{
zip(file, outstream, staticFile);
}
else
{
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1);
ZipEntry entry = new ZipEntry(tempfile);
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
outstream.PutNextEntry(entry);
outstream.Write(buffer, 0, buffer.Length);
}
}
RetState = true;
}
catch (Exception)
{
RetState = false;
}
return RetState;
}
UnZipFile(SaveZipFilePath, SaveFileDir);
public bool UnZipFile(string ZipFilePath, string SaveFileDir)
{
bool RetState = false;
try
{
if (!File.Exists(ZipFilePath)) return false;
ZipInputStream inputstream = new ZipInputStream(File.OpenRead(ZipFilePath.Trim()));
ZipEntry entry;
string path = SaveFileDir;
string rootDir = "";
while ((entry = inputstream.GetNextEntry()) != null)
{
rootDir = Path.GetDirectoryName(entry.Name);
if (rootDir.IndexOf("\\") >= 0)
{
rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
}
string dir = Path.GetDirectoryName(entry.Name);
string fileName = Path.GetFileName(entry.Name);
if (dir != "")
{
if (!Directory.Exists(SaveFileDir + "\\" + dir))
{
path = SaveFileDir + "\\" + dir;
Directory.CreateDirectory(path);
}
}
else if (dir == "" && fileName != "")
{
path = SaveFileDir;
}
else if (dir != "" && fileName != "")
{
if (dir.IndexOf("\\") > 0)
{
path = SaveFileDir + "\\" + dir;
}
}
if (dir == rootDir)
{
path = SaveFileDir + "\\" + rootDir;
}
if (fileName != String.Empty)
{
FileStream fs = File.Create(path + "\\" + fileName);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = inputstream.Read(data, 0, data.Length);
if (size > 0)
{
fs.Write(data, 0, size);
}
else
{
break;
}
}
fs.Close();
}
}
inputstream.Close();
RetState = true;
}
catch (Exception)
{
RetState = false;
}
return RetState;
}
阅读原文:原文链接
该文章在 2025/7/21 15:18:21 编辑过