C# 使用shell解压缩zip文件时发生参数错误

C# 使用shell解压缩zip文件时发生参数错误,c#,com,compression,zip,windows-shell,C#,Com,Compression,Zip,Windows Shell,我需要解压缩位于基本目录中的文件,例如sample.zip。我已为此制作了一个示例应用程序。我有一个输入参数-目标目录。以下是代码示例: private void BInstall_Click(object sender, EventArgs e) { string currentdir = Directory.GetCurrentDirectory();//Gets current directory string zip = currentdir + "\\" + "samp

我需要解压缩位于基本目录中的文件,例如sample.zip。我已为此制作了一个示例应用程序。我有一个输入参数-目标目录。以下是代码示例:

private void BInstall_Click(object sender, EventArgs e)
{
    string currentdir = Directory.GetCurrentDirectory();//Gets current directory
    string zip = currentdir + "\\" + "sample.zip";//Path to zip file
    string outPath = TBoutputPath.Text;
    exctract(zip ,outPath );
}
下面是提取zip文件的函数:

void exctract(string name, string path)
{
    string[] args = new string[2];
    if (name.IndexOf(" ") != -1)
    {
        //we got a space in the path so wrap it in double qoutes
        args[0] += "\"" + name + "\"";
    }
    else
    {
        args[0] += name;
    }

    if (path.IndexOf(" ") != -1)
    {
        //we got a space in the path so wrap it in double qoutes
        args[1] += " " + "\"" + path + "\"";
    }
    else
    {
        args[1] +=path;
    }

    Shell32.Shell sc = new Shell32.Shell(); 
    Shell32.Folder SrcFlder = sc.NameSpace(args[0]);
    Shell32.Folder DestFlder = sc.NameSpace(args[1]);
    Shell32.FolderItems items = SrcFlder.Items();
    DestFlder.CopyHere(items , 20); 
}
DestFlder.CopyHere(第20项)我得到了NullReferenceException,我不知道为什么,因为对象不应该为null。是DestFlder为空;似乎SrcFolder已初始化,但DestFlder未初始化。我能找到的唯一区别是DestFlder没有以下文件扩展名,但因为它是一个文件夹,所以无论如何也不应该有一个


有人能解释一下我做错了什么以及如何解决吗?

这个问题的答案是。。。琐碎,但作为所有最简单的问题,几乎不可能想到

该文件夹不存在,因此无法引用。此代码段修复了以下问题:

        if (!Directory.Exists(args[1]))
            Directory.CreateDirectory(args[1]);

Thou DJ KRAZE确实指出了脚本的另一个问题,它最终可能会出现运行时错误。谢谢你

这个问题的答案是。。。琐碎,但作为所有最简单的问题,几乎不可能想到

该文件夹不存在,因此无法引用。此代码段修复了以下问题:

        if (!Directory.Exists(args[1]))
            Directory.CreateDirectory(args[1]);

Thou DJ KRAZE确实指出了脚本的另一个问题,它最终可能会出现运行时错误。谢谢你

您能否使用调试器确定哪个对象(DestFlder,items)为null(如果有的话)?虽然让shell为您执行此操作是一个有趣的问题,但使用解压库(例如Sharpziplibt)可能是最简单的方法DestFlder显示为null,并提供“无法发现有关此对象的更多信息”错误报告。Well 20是一个int,所以这个应该是一个问题:查看您的代码,其中+=“\”+“\ \”是在字符串zip=currentdir+“\”+“sample.zip”中定义的//zip文件的路径可能您正在附加一个“\”调试,并确保您要查找的内容位于以下字符串currentdir=Directory.GetCurrentDirectory()中//获取当前目录字符串zip=currentdir+“\\”+“sample.zip”//zip文件的路径也许你有一些路径问题..我检查过了。这不是问题所在。SrcFolder已经启动,但DestFlder没有,唯一的区别是DestFlder没有文件扩展名,但因为它是一个文件夹,所以不应该有文件扩展名。您正在测试的示例名称中是否有空格?为什么要将前导空格添加到arg[1]-带空格大小写?是否可以使用调试器确定哪个对象(DestFlder,items)为null(如果有的话)?虽然让shell为您执行此操作是一个有趣的问题,但使用解压库(例如Sharpziplibt)可能是最简单的方法DestFlder显示为null,并提供“无法发现有关此对象的更多信息”错误报告。Well 20是一个int,所以这个应该是一个问题:查看您的代码,其中+=“\”+“\ \”是在字符串zip=currentdir+“\”+“sample.zip”中定义的//zip文件的路径可能您正在附加一个“\”调试,并确保您要查找的内容位于以下字符串currentdir=Directory.GetCurrentDirectory()中//获取当前目录字符串zip=currentdir+“\\”+“sample.zip”//zip文件的路径也许你有一些路径问题..我检查过了。这不是问题所在。SrcFolder已经启动,但DestFlder没有,唯一的区别是DestFlder没有文件扩展名,但因为它是一个文件夹,所以不应该有文件扩展名。您正在测试的示例名称中是否有空格?为什么要在带有空格的arg[1]中添加前导空格?