获取在网络驱动器上打开文件的用户的用户名 - Microsoft Office Style

Get username of user who has file open on network drive - Microsoft Office Style

我想为 Windows 下的软件 运行 添加用户友好的 文件锁定 (Windows 7 大部分),用C#编写。 我已经实现了文件锁定部分,通过在相应的进程中保持文件在使用中 "open"。我现在还想补充的是识别当前拥有文件的用户 open/locked.

正在访问的文件位于 映射网络驱动器 上,由不同计算机上的不同用户使用。 当一个文件被锁定并且另一个人试图打开该文件时,他应该会看到一个对话框,类似于 Microsoft Office 程序中的 "File in use" 对话框。在那里,还会显示当前编辑文件的用户名。

我找到了找出进程的解决方案,这些进程打开了某个文件(使用了这个:How do I find out which process is locking a file using .NET?) 而且我还能够从中读取创建此流程的用户的姓名。但是,在网络驱动器上打开锁定文件时,这样做产生的用户名始终是我自己的用户名,而不是锁定文件的用户的用户名。

有没有人知道如何实现这一目标?我的意思是 Microsoft Office 也可以在我的同一台 PC 上以相同的用户权限执行此操作。我只是想知道如何...

干杯!

Office 使用了一种非常简单的技术,我将用 .NET 术语来谈论它。每当 Office 应用程序使用 FileShare.None 打开文档文件时,它还会创建一个隐藏的 "lock-file",其名称基于文档文件(例如,附加“.lockfile”)。并将 Environment.UserDomainName 写入该文件。该文件是用 FileOptions.DeleteOnClose 和 FileShare.Read 创建的,只要文档文件打开就保持打开状态。

再次关闭文档时,它会关闭锁定文件。使用 FileOptions.DeleteOnClose 确保锁定文件即使在程序崩溃时也会消失。

当打开文件产生锁定冲突时,它会寻找锁定文件并读取用户名。简单易行,易于自己实施。但是当然只有在打开文件的是一个特定的应用程序时才能工作。