c# - 如何设置文件权限以防止其他人对我的文件进行独占锁定?

标签 c# .net file-locking

我想使用 C#/.NET 在 Windows 7 主机上打开文件进行追加。为此,我想使用通常的文件输出操作。我找到了这样的解决方案:

FileStream trace_fd = new FileStream(r"c:\temp\testlog.txt", 
                                     FileMode.Append, 
                                     FileAccess.Write, 
                                     FileShare.ReadWrite)

即使我上面一行的程序启动并运行,我的跟踪文件也是可读的。我没有异常(exception),文件不再被另一个进程使用,就像这样的正确代码:

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)

这样的行显然是日志扫描器的错误。如果我的程序没有运行,那么有问题的 logscaner 将获得独占锁,我的程序的后续运行将无法获得跟踪文件的 fd。

我的问题是我能做些什么来防止这种可怕的情况发生。 例如。我可以为跟踪文件设置文件权限以防止任何人获得独占锁吗?如果是那么如何?还有什么可以保护我的程序免受错误日志扫描器问题的影响吗?请注意,我必须在我的程序运行之间保持相同的跟踪文件名。

最佳答案

您不能设置权限以允许对文件的任何访问,但以某种方式限制 FileShare.None,因为文件共享模式与访问权限无关。

权限授予进程(基于其运行的帐户)对文件/资源​​的访问权限。如果授予访问权限的进程可以使用它想要的任何共享模式打开文件。如果此共享模式与文件请求成功时的现有共享模式不冲突,现在文件将具有此共享模式(与之前的模式相结合)。参见 CreateFile- dwShareMode section了解详情。

在您的情况下,日志阅读器需要具有打开文件的权限,因此如果它是第一个打开文件的进程,它将能够设置 ShareMode.None。正如 devshorts 所说,除了更改违规进程或破解文件访问方法(搜索“hook CreateFile”)之外,您无能为力。

旁注:如果您的日志阅读器在与其他进程相同的帐户下运行,则出于另一个原因,权限将无济于事 - 因为 Windows 中没有“每个进程”权限,所有进程将共享同一用户的权限。

关于c# - 如何设置文件权限以防止其他人对我的文件进行独占锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12252127/

相关文章:

c# - 使用 .AsFactory() 确定运行时类型

delphi - 从本地客户端连接中检索带有路径的服务器数据的SQL SELECT

vba - 删除连续的重复项 : "File sharing lock count exceeded" at 9k of 1m records

.net - 如何衡量.NET 中的代码性能?

c# - 获取派生接口(interface)中可用的接口(interface)方法列表

.net - 匹配正则表达式中的逗号分隔组(模式中没有冗余)

c - fcntl : invalid argument in C

c# - 在 RichTextBox 中显示 NLog 跟踪

c# - 将字符串属性限制为一组预定义的值(枚举中没有连字符的解决方法)

c# - LINQ 按总和分组未按预期工作