在C#中提取嵌入的资源

时间:2014-07-05 07:19:41

标签: c# embedded-resource

我的C#可执行文件中嵌入了四个资源文件,一个python脚本和3个perl脚本。我可以成功提取所有三个perl脚本。但我无法提取python脚本。我尝试了很多方法。有人可以看看吗?谢谢。

public static string ExtractResource(string resourceName)
{
    string destFile = "";

    //look for the resource name
    foreach (string currentResource in System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() )
        if (currentResource.LastIndexOf(resourceName) != -1)
        {
            string subPath = Common_Utilities.GetTempPath() + "SCRIPTS"; 
            bool isExists = System.IO.Directory.Exists(subPath);

            if (!isExists)
               System.IO.Directory.CreateDirectory(subPath);

            string strFile = subPath + "\\" + resourceName;
            string path = System.IO.Path.GetDirectoryName(strFile);
            string rootName = System.IO.Path.GetFileNameWithoutExtension(strFile);
            destFile = path + @"\" + rootName + System.IO.Path.GetExtension(currentResource);

            System.IO.Stream fs = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream( currentResource ) ;

            byte[] buff = new byte[fs.Length];
            fs.Read(buff, 0, (int)fs.Length);
            fs.Close();

            System.IO.FileStream destStream = new System.IO.FileStream(destFile, FileMode.Create);
            destStream.Write(buff, 0, buff.Length);
            destStream.Close();
    }

    return destFile;
    // throw new Exception("Resource not found : " + resourceName);
}

2 个答案:

答案 0 :(得分:1)

不确定为什么不能提取Python脚本......但是几点:

  1. 我建议使用Path.Combine()将路径和文件名粘在一起 - 不要自己这样做,错误的机会太多了!

  2. 由于这些是(基于文本的)脚本,您可以更简单地完成整个复制:

     System.IO.Stream fs = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(currentResource);
    
     string scriptContents = new StreamReader(fs).ReadToEnd();
     File.WriteAllText(destFile, scriptContents); 
    

    使用这种方法,您应该能够轻松地在调试中看到脚本是否从资源中正确加载。如果不是 - 检查您的资源名称等(脚本是否真的设置为"嵌入"资源?)。如果您有资源的子目录,请注意资源名称将包含这些子目录作为完全限定名称的一部分 - 但用点(.)分隔,而不是像物理路径!

答案 1 :(得分:0)

使用

修改代码的简便方法
Binary files -> File.WriteAllBytes(Path, Properties.Resources.filename);
Text files -> File.WriteAllText(Path, Properties.Resources.filename);