Extract embedded resources in C#

邮差的信 提交于 2020-12-16 06:49:48

问题


I have four resource files embedded in my C# executable, 1 python script and 3 perl scripts. I could extract all three perl scripts successfully. But I am not able to extract the python script. I tried so many ways. Could someone please have a look ? Thank you.

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);
}

回答1:


Not sure why the Python script can't be extracted.... couple points though:

  1. I would recommend to use Path.Combine() to stick together path and file name - don't do this yourself, too many chances for error!

  2. Since those are (text-based) scripts, you could do the whole copying much simpler:

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

    With this approach, you should be easily able to see in debugging whether or not the script is properly loaded from resources. If not - check your resource name etc. (is the script really set to "embedded" resource?). If you have subdirectories for your resources, be aware that the resource name will contain those subdirectories as part of the fully qualified name - but separated by a dot (.), not a backslash like a physical path!




回答2:


easy way you can mod your code with

Binary files -> File.WriteAllBytes(Path, Properties.Resources.filename);
Text files -> File.WriteAllText(Path, Properties.Resources.filename);


来源:https://stackoverflow.com/questions/24584040/extract-embedded-resources-in-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!