在.net c#中使用7za
本文关键字:7za net | 更新日期: 2023-09-27 18:21:13
我是c#和这个网站的新手,所以我可能会犯一些错误,但希望我也能学到。
我正在尝试开发一个应用程序,从.7z的文件中提取一个文件,读取并删除它,然后再转到下一个文件(其中大约有12k个文件,占用了很多空间)。
现在,我使用的是.NET 2.0,但我还没有找到从存档中提取单个文件的简单解决方案。我看到一篇帖子解释说,你可以从命令行使用7za.exe来执行此操作,我照做了。现在,问题是,如果我试图在我的应用程序7za中执行同样的操作,就会出现"不能使用绝对路径名"错误。但是,正如我所说,相同的参数在命令提示符下工作。
我的想法是获得压缩文件夹中所有文件的列表,并将其放在文本文件中。从那里可以很容易地获得第一个的名称,解压缩它,读取它,删除它,然后移动到下一个。这就是我得到的列表:
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.FileName = @"C:'Users'yadayada'Desktop'7za.exe"; //just testing
string parameters= "-y l " + path_file7z + " > " + path_file_destination + @"'file.txt";
//needeless to say, path_file7z and path_file_destination are strings with the correct path like "C:'Users'yadayada'Desktop"
startInfo.Arguments = parameters
process.StartInfo = startInfo;
process.StartInfo.UseShellExecute = false;
process.Start();
process.WaitForExit();
正如我所说,当这个过程结束时,我可以看到控制台打开和关闭。我拍了一张截图来检查它说了什么,我得到的错误就是我在问题开始时说的错误。
现在,有人知道我为什么会出现这个错误吗?我该如何解决这个问题?
解决方案
结束了一个不太优雅(温和)的解决方案的工作。
列出名称:
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.FileName = @"cmd.exe";
string parameters= "/k -y l " + path_file7z + " > " + path_file_destination + @"'file.txt";
//needeless to say, path_file7z and path_file_destination are strings with the correct path like "C:'Users'yadayada'..."
startInfo.Arguments = parameters
process.StartInfo = startInfo;
process.StartInfo.UseShellExecute = false;
process.Start();
Thread.Sleep(1000);
process.Kill();
现在,一旦完成了这项工作,提取部分将通过类似于Igor链接提供的方法进行处理:
public void ExtractFile(string source, string element, string destination)
{
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = /*7zG.exe's path*/;
startInfo.Arguments = @"-y x " + source + " -o" + destination + " " + element + " -r";
process.StartInfo = startInfo;
process.StartInfo.UseShellExecute = false;
process.Start();
process.WaitForExit();
}
我认为它现在运行良好。如果我有进一步的问题,我会用我提出的解决方案和提供的帮助来更新这一点。再次感谢!
将本教程用于7zip:https://stick2basic.wordpress.com/2013/04/25/how-to-extract-7z-file-to-a-folder-c-net/
如果允许rar和zip,请使用此库:http://dotnetzip.codeplex.com/
private void MyExtract()
{
string zipToUnpack = "C1P3SML.zip";
string unpackDirectory = "Extracted Files";
using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
{
// here, we extract every entry, but we could extract conditionally
// based on entry name, size, date, checkbox status, etc.
foreach (ZipEntry e in zip1)
{
e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);
}
}
}
编辑
这可以帮助您:使用7z.exe 解压缩c#中的文件
很高兴能帮助你!