2011-10-01 58 views
3

我正在写一个大学的TFTP服务器程序,它需要独占访问打开的文件以供阅读。因此可以配置如果文件被另一个进程锁定,以等待文件解锁。等待文件解锁 - Windows

Win32上有没有什么方法可以等待文件变为解锁而不首先创建句柄?

我问这个问题的原因是,如果另一个进程调用CreateFile(),并且dwShareMode与我的进程使用的dwShareMode不兼容,我甚至不能使用文件句柄来等待使用LockFileEx()

感谢您的帮助提前!

+0

相关:[等到文件解锁为.NET](http://stackoverflow.com/q/50744/196844) –

回答

2

如果您看看堆栈溢出问题What Win32 API can be used to find the process that has a given file open?SYSTEM_HANDLE_INFORMATION structure,您将找到可用于枚举进程和每个正在运行的进程的所有打开句柄的代码链接。此信息可用于获取文件打开的进程的HANDLE以及文件的HANDLE。然后,您将使用DuplicateHandle()创建文件HANDLE的副本,但在TFTP进程的句柄表中。重复的HANDLE然后可以由TFTP过程使用LockFileEx()

此解决方案依赖于内部函数NtQuerySystemInformation()以及可用于枚举打开句柄的未记录系统信息类值。请注意,此功能NtQuerySystemInformation()“可能会在未来版本的Windows中被更改或无法使用”。您可能需要使用SEH处理程序来防止发生访问冲突。

+0

谢谢你的帮助。我没想到它会那么复杂。由于我不想进入NT本地API(我也确信这不是我教授的意图),我决定尝试使用CreateFile()正常打开文件,然后使用LockFileEx()。如果CreateFile()失败,我发出错误信号。再次感谢您的帮助。 – tommazzo

2

由于像MS和OH和Process Explorer这样的工具可以完成它,所以可以通过进程打开所有的句柄。从那里等待你想要什么路还很漫长,但它是一个开始:)

如果你没有成功的Win32 API,一个地方看是肯定的NT Native API http://en.wikipedia.org/wiki/Native_API

您可以从这里开始http://msdn.microsoft.com/en-us/library/windows/desktop/ms724509%28v=vs.85%29.aspx并查看它是否适用于SystemProcessInformation标志。 外观也这里开始http://nsylvain.blogspot.com/2007/09/how-list-all-open-handles.html

本机API是记录不完整,但你可以在网上(喜欢这里http://www.osronline.com/article.cfm?id=91)找到资源

作为一个声明,我要补充的是,本机API是某种“内部” ,因此在未来的版本中可能会发生变化。然而,一些函数也在DDK中公开地公开在内核级别,所以这些函数改变的可能性很低。

祝你好运!

+1

很容易标记为不是答案 –

+0

谢谢你的帮助。我没想到它会那么复杂。由于我不想进入NT本地API(我也确信这不是我教授的意图),我决定尝试使用CreateFile()正常打开文件,然后使用LockFileEx()。如果CreateFile()失败,我发出错误信号。再次感谢您的帮助。 – tommazzo