使用c#或批处理自动使用winrar提取ISO

ELS*_*epO 3 c# batch-file winrar

我正在尝试将ISO提取到一个名称相同但没有.iso的文件夹.

我遇到了winrar的问题,因为当我从带有ISO的文件夹开始搜索时,它不会启动提取.

更新了答案代码

private void ExtractISO(string toExtract, string folderName)
    {
        // reads the ISO
        CDReader Reader = new CDReader(File.Open(toExtract, FileMode.Open), true);
        // passes the root directory the folder name and the folder to extract
        ExtractDirectory(Reader.Root, folderName /*+ Path.GetFileNameWithoutExtension(toExtract)*/ + "\\", "");
        // clears reader and frees memory
        Reader.Dispose();
    }

    private void ExtractDirectory(DiscDirectoryInfo Dinfo, string RootPath, string PathinISO)
    {
        if (!string.IsNullOrWhiteSpace(PathinISO))
        {
            PathinISO += "\\" + Dinfo.Name;
        }
        RootPath += "\\" + Dinfo.Name;
        AppendDirectory(RootPath);
        foreach (DiscDirectoryInfo dinfo in Dinfo.GetDirectories())
        {
            ExtractDirectory(dinfo, RootPath, PathinISO);
        }
        foreach (DiscFileInfo finfo in Dinfo.GetFiles())
        {
            using (Stream FileStr = finfo.OpenRead())
            {
                using (FileStream Fs = File.Create(RootPath + "\\" + finfo.Name)) // Here you can Set the BufferSize Also e.g. File.Create(RootPath + "\\" + finfo.Name, 4 * 1024)
                {
                    FileStr.CopyTo(Fs, 4 * 1024); // Buffer Size is 4 * 1024 but you can modify it in your code as per your need
                }
            }
        }
    }

    static void AppendDirectory(string path)
    {
        try
        {
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
        }
        catch (DirectoryNotFoundException Ex)
        {
            AppendDirectory(Path.GetDirectoryName(path));
        }
        catch (PathTooLongException Ex)
        {
            AppendDirectory(Path.GetDirectoryName(path));
        }
    }
Run Code Online (Sandbox Code Playgroud)

用户选择要提取的文件夹(.ISO)toExtract.然后我在后台worker中的Process.Start()中使用它.这似乎打开了安装软件,并没有将ISO提取到所需的文件夹名称.

在此先感谢您的帮助.

或者,如果有人可以给我一个批处理来提取ISO,并从c#调用它来传递给提取,并且文件夹名称也会有用.

谢谢

Wri*_*ick 10

如果外部类库是好的!

然后使用SevenZipSharp.NET DiscUtils提取ISO的......

这两个ClassLibraries可以管理ISO并提取它们!

对于DiscUtils你可以找到ISO管理[一些代码CDReader的链接类]我提供的.

但是,For SevenZipSharp,请探索ClassLibrary源代码并找到要提取的代码或Google来查找它!

要获取文件夹的名称,只需使用Path.GetFileNameWithoutExtension((string)ISOFileName)将返回"ISOFile"名为iso 的文件夹"ISOFile.iso".然后你可以用你想要的路径.

UPDATE

使用DiscUtils提取ISO映像的代码:

using DiscUtils;
using DiscUtils.Iso9660;

void ExtractISO(string ISOName, string ExtractionPath)
{
    using (FileStream ISOStream = File.Open(ISOName, FileMode.Open))
    {
        CDReader Reader = new CDReader(ISOStream, true, true);
        ExtractDirectory(Reader.Root, ExtractionPath + Path.GetFileNameWithoutExtension(ISOName) + "\\", "");
        Reader.Dispose();
    }
}
void ExtractDirectory(DiscDirectoryInfo Dinfo, string RootPath, string PathinISO)
{
    if (!string.IsNullOrWhiteSpace(PathinISO))
    {
        PathinISO += "\\" + Dinfo.Name;
    }
    RootPath += "\\" + Dinfo.Name;
    AppendDirectory(RootPath);
    foreach (DiscDirectoryInfo dinfo in Dinfo.GetDirectories())
    {
        ExtractDirectory(dinfo, RootPath, PathinISO);
    }
    foreach (DiscFileInfo finfo in Dinfo.GetFiles())
    {
            using (Stream FileStr = finfo.OpenRead())
            {
                using (FileStream Fs = File.Create(RootPath + "\\" + finfo.Name)) // Here you can Set the BufferSize Also e.g. File.Create(RootPath + "\\" + finfo.Name, 4 * 1024)
                {
                    FileStr.CopyTo(Fs, 4 * 1024); // Buffer Size is 4 * 1024 but you can modify it in your code as per your need
                }
            }
    }
}
static void AppendDirectory(string path)
{
    try
    {
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
    }
    catch (DirectoryNotFoundException Ex)
    {
        AppendDirectory(Path.GetDirectoryName(path));
    }
    catch (PathTooLongException Exx)
    {
        AppendDirectory(Path.GetDirectoryName(path));
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

ExtractISO(ISOFileName, Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\");
Run Code Online (Sandbox Code Playgroud)

工作!经过我的测试!

当然,您可以随时为代码添加更多优化...

本准则只是一个基本的!

  • 感谢您加倍努力!您可能希望使用较小的缓冲区和循环而不是将整个文件读入内存,以便更容易提取更大的文件(例如[在Jon的答案中](http://stackoverflow.com/a/411605/243245)并且可能在文件之间重复使用相同的缓冲区但所有看起来都很好. (2认同)