假设我在内存中有可执行文件(或 bat 脚本,没关系)的内容,并希望将其作为新进程运行。这很容易。
File.WriteAllBytes(filePath, contents);
// gap
Process.Start(filePath)
但我想确保执行的文件没有被任何其他进程篡改。文件创建和执行之间存在差距。它提供了使用正确工具篡改文件的机会。
因此,File.WriteAllBytes
我没有打开FileStream FileShare.Read
并保持打开状态,直到执行完成。
using(var fileStream = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write, FileShare.Read))
{
Process.Start(filePath)
}
但这不起作用。Process.Start
失败:
System.ComponentModel.Win32Exception (32):进程无法访问该文件,因为它正被另一个进程使用。
这个问题及其答案解释了我为什么这么认为。简而言之,Process.Start
将尝试打开文件FileShare.Read
并失败,因为打开的 FileStream 已经具有写入访问权限,因此FileShare.Read
该过程的尝试失败。
有没有办法干净地做到这一点?
我能想到的一种解决方法FileShare.Read
是保存文件,关闭它,用and打开一个新的 FileStream FileAccess.Read
,确保在执行之前内容仍然相同。但这并不漂亮。