gpt4 book ai didi

c# - File.Open for read access denied on executing file in Windows

转载 作者:可可西里 更新时间:2023-11-01 14:40:59 28 4
gpt4 key购买 nike

我在 Windows 中执行文件时遇到文件权限问题,在遵循论坛提示 [1] 后似乎已解决,但我不明白为什么。也许你们可以提供帮助。

我通过执行文件(读取控制台输出)来检查文件的标题,然后使用 FileStream 打开相同的文件以便随后读取:

public void fileMD5(string filename) {
if (!File.Exists(filename)) return NT.Fail("File does not exist: " + filename);

BinaryReader stream = new BinaryReader(File.Open(filename,
FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int readBytes;
while ((readBytes = stream.Read(buffer, 0, bufferSize)) > 0) {
md5Hasher.TransformBlock(buffer, 0, readBytes, buffer, 0);
}
stream.Close();
}

fileMD5('sample.exe');

每隔一段时间我就会收到“文件正在被另一个进程使用”的消息。从维基百科我知道 Windows 将锁定执行文件拒绝写访问 [2],但我只是阅读。此外,当我尝试打开它时,该过程应该已经停止。

从论坛帖子看来,添加 FileShare.ReadWrite 会有所帮助,而且似乎确实如此:

FileStream stream = File.Open('sample.exe', 
FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

但是我不明白为什么。这里有我没有看到的竞争条件吗?

此外,使用 FileShare.ReadWrite 而不是默认设置(我猜是 FileShare.Read),File.Open 调用似乎更快。

[1] http://www.xtremevbtalk.com/archive/index.php/t-192118.html

[2] http://en.wikipedia.org/wiki/File_locking#In_Microsoft_Windows

最佳答案

当您没有指定 FileShare 参数时,此选项的默认值为 FileShare.None,实际上 File 类中的代码只是执行此操作:

public static FileStream Open(string path, FileMode mode, FileAccess access)
{
return File.Open(path, mode, access, FileShare.None);
}

关于性能,我只能想象指定 FileShare.ReadWrite 意味着 Windows 不需要获取文件的锁。

就您遇到的“文件正在被另一个进程使用”错误而言,如果您将流变量的使用包装在一个 using block 中,那么这个问题是否会消失,以便在您使用时立即处理流完成了吗?

using (var stream = File.Open('sample.exe', FileMode.Open, FileAccess.Read))
{
//do something with the stream here
}

关于c# - File.Open for read access denied on executing file in Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007671/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com