我的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);
}
答案 0 :(得分:1)
不确定为什么不能提取Python脚本......但是几点:
我建议使用Path.Combine()
将路径和文件名粘在一起 - 不要自己这样做,错误的机会太多了!
由于这些是(基于文本的)脚本,您可以更简单地完成整个复制:
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);