我想使用C#/ .NET在Windows 7主机上打开附加文件。我想为此目的使用通常的文件输出操作。我找到了这样的解决方案:
FileStream trace_fd = new FileStream(r"c:\temp\testlog.txt",
FileMode.Append,
FileAccess.Write,
FileShare.ReadWrite)
我的跟踪文件即使我上面的程序已启动并运行也是可读的。我没有异常,另一个进程使用的文件不再是正确的代码,如下所示:
FileStream good_logreader_fd = new FileStream("c:\temp\testlog.txt",
FileMode.Read,
FileAccess.Read,
FileShare.ReadWrite)
然后我有另一个程序(越野车日志扫描仪),有这样一行:
FileStream bad_logreader_fd = new FileStream("c:\temp\testlog.txt",
FileMode.Read,
FileAccess.Read,
FileShare.None)
这条线显然是日志扫描程序的一个错误。如果我的程序没有运行,那么buggy logscaner将获得独占锁定,并且我的程序的后续运行将无法获得跟踪文件的fd。
我的问题是如何防止这种可怕的情况发生。 例如。我可以为跟踪文件设置文件权限,以防止任何人进行独占锁定吗?如果是,那怎么样?还有什么可以保护我的程序免受错误的日志扫描程序问题?请注意,我必须在程序运行之间保留相同的跟踪文件名。
答案 0 :(得分:2)
据我所知,你不能阻止别人试图在另一种文件访问模式下打开文件而不修改他们的代码。
答案 1 :(得分:2)
您无法设置权限以允许对文件的任何访问,但以某种方式限制FileShare.None,因为文件共享模式与访问权限无关。
权限允许进程(基于其运行的帐户)访问文件/资源。如果访问授权进程可以打开具有所需共享模式的文件。如果此共享模式与文件请求成功的现有共享模式不冲突,现在文件将具有此共享模式(与前一个共享)。有关详细信息,请参阅CreateFile- dwShareMode section。
在您的情况下,日志阅读器需要具有打开文件的权限,因此如果它是第一个打开文件的进程,它将能够设置ShareMode.None。正如devshorts所说,没有太多可以做的就是更改违规过程或黑客文件访问方法(搜索“hook CreateFile”)。
附注:如果您的日志阅读器在与其他进程相同的帐户下运行,则权限将无法帮助另外一个原因 - 因为Windows中没有“每个进程”权限,并且所有进程将共享相同用户的权限。