如何启动作为资源的进程?解决Win32Exception找不到文件问题
问题解决方法
主问题:无法通过资源启动bat进程的原因及修复
当你把test.bat添加为项目资源时,它会被存储为文本内容(字符串)或者字节数组,而Process.StartInfo.FileName要求传入的是文件的物理路径,不是文件内容——你直接传资源内容,系统自然找不到对应的文件,所以抛出找不到文件的错误。
正确的做法是把资源中的bat内容写入到临时文件,再通过临时文件路径启动进程,修改后的代码如下:
public async void button_A_Click(object sender, EventArgs e) { button_A.Enabled = false; await Task.Run(() => { // 1. 获取资源中的bat内容 string batContent = LOS_Installer.Properties.Resources.test; // 2. 创建唯一的临时bat文件 string tempBatPath = Path.Combine(Path.GetTempPath(), $"temp_test_{Guid.NewGuid()}.bat"); File.WriteAllText(tempBatPath, batContent); var proc = new Process(); proc.StartInfo.FileName = tempBatPath; // 使用临时文件路径 proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.Arguments = path; try { if (proc.Start()) { void outputCallback(string data) { if (!string.IsNullOrEmpty(data)) { textBoxLog.AppendText(data); textBoxLog.AppendText(Environment.NewLine); } } proc.OutputDataReceived += (_, e) => Invoke(outputCallback, e.Data); proc.ErrorDataReceived += (_, e) => Invoke(outputCallback, e.Data); proc.BeginOutputReadLine(); proc.BeginErrorReadLine(); } proc.WaitForExit(); } finally { // 3. 进程结束后清理临时文件 if (File.Exists(tempBatPath)) { File.Delete(tempBatPath); } } }); button_A.Enabled = true; }
说明:
- 用
Guid.NewGuid()生成唯一文件名,避免临时文件冲突 finally块保证无论进程执行结果如何,临时文件都会被删除- 新增空值判断,避免日志中出现无效空行
附带问题:同名不同扩展名的资源处理
项目资源管理器在添加同名不同扩展名的文件时,会自动给资源名称加后缀(比如test.bat和test.txt添加后,资源名称会变成test和test1)。你也可以手动修改资源的名称属性(在资源编辑器的“名称”列),比如把test.bat的资源名改成test_bat,test.txt改成test_txt,这样就能明确区分不同资源,避免混淆。
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

