从程序C#中提取文件时出错

时间:2013-08-28 11:18:58

标签: c# embedded-resource extraction

我之前在我的程序中嵌入了文件并取得了圆满成功,但我现在已将代码行转移到第二个程序,令我失望的是,我无法让它在我的生活中工作。

提取的代码是:

private static void Extract(string nameSpace, string outDirectory, string internalFilePath, string resourceName)
    {
        Assembly assembly = Assembly.GetCallingAssembly();

        using (Stream s = assembly.GetManifestResourceStream(nameSpace + "." + (internalFilePath == "" ? "" : internalFilePath + ".") + resourceName))
        using (BinaryReader r = new BinaryReader(s))
        using (FileStream fs = new FileStream(outDirectory + "\\" + resourceName, FileMode.OpenOrCreate))
        using (BinaryWriter w = new BinaryWriter(fs))
            w.Write(r.ReadBytes((int)s.Length));
    }

要提取我想要位于名为NewFolder1的文件夹中的程序,我输入代码:

Type myType = typeof(NewProgram);
            var n = myType.Namespace.ToString();
            String TempFileLoc = System.Environment.GetEnvironmentVariable("TEMP");
            Extract(n, TempFileLoc, "NewFolder1", "Extract1.exe");

我可以编译程序没有错误,但一旦程序到达要提取的行:

Extract(n, TempFileLoc, "NewFolder1", "Extract1.exe");

程序崩溃,我收到错误:“值不能为空”

是的我包括System.IO&的System.Reflection

1 个答案:

答案 0 :(得分:1)

有几件事。

首先,您可能应该添加一些错误检查,以便您可以找出失败的地方。而不是:

using (Stream s = assembly.GetManifestResourceStream(nameSpace + "." +
   (internalFilePath== "" ? "" : internalFilePath + ".") + resourceName))

写:

string name = nameSpace + "." +
   (internalFilePath== "" ? "" : internalFilePath + ".") + resourceName;
Stream s = assembly.GetManifestResourceStream(name);
if (s == null)
{
    throw new ApplicationException(); // or whatever
}

using (s)
{
    // other stuff here
}

打开FileStream时,您应该做同样的事情。

如果进行了这些更改,您可以单步执行调试器或编写代码以输出跟踪信息,告诉您完全发生错误的位置。

其次,此处不需要BinaryReaderBinaryWriter。你可以写:

s.CopyTo(fs);

将复制整个流内容。