Winapi Windows-从代码打开文件并等待其关闭

Winapi Windows-从代码打开文件并等待其关闭,winapi,Winapi,我需要一些帮助和/或建议 我正在使用默认关联的windows程序中的代码或使用ShellExecute或CreateProcess使用选定的windows程序打开文件。然后我等待过程完成。但这对我来说并不奏效,因为: 假设文本文件(*.txt)的默认关联程序是Notepad++(NPP)。为了完成该过程,核电站一开始不得打开,必须关闭才能完成该过程 但是如果NPP已经打开,文件将在已经打开的NPP中打开。但我不一定要关闭NPP来完成这个过程,我只想关闭打开的文本文件,需要检测文件是否已关闭,而不

我需要一些帮助和/或建议

我正在使用默认关联的windows程序中的代码或使用
ShellExecute
CreateProcess
使用选定的windows程序打开文件。然后我等待过程完成。但这对我来说并不奏效,因为:

假设文本文件(*.txt)的默认关联程序是Notepad++(NPP)。为了完成该过程,核电站一开始不得打开,必须关闭才能完成该过程

但是如果NPP已经打开,文件将在已经打开的NPP中打开。但我不一定要关闭NPP来完成这个过程,我只想关闭打开的文本文件,需要检测文件是否已关闭,而不是NPP

所以我意识到等待过程完成是行不通的。我尝试过几种方法,比如尝试检测文件是否在另一个进程中打开,但没有成功


所以我的问题是,什么是最好的方法来检测文件何时打开或正在使用,反之亦然?

听起来您想知道文件句柄何时“关闭”,而不一定是在操作该文件的程序退出时

你的问题与我的工作密切相关。您可以引用它来定期轮询进程句柄以查看打开了哪些文件。这将有时间问题-首先可能需要几秒钟的时间才能打开文件

还有一些工具,例如,可能很有用

然而,这些解决方案都不是完美的。有些应用程序,包括Notepad.exe,只需打开文件,读取内容,然后立即关闭句柄。当用户单击“保存”时,将重新打开文件进行写入,内容将保存回磁盘,然后再次关闭文件句柄


更简单的方法是通过定期轮询文件上最后修改的时间戳。当它更改时,您可以假定文件已“保存”。或者将此技术与上述技术结合使用,和/或等待启动的应用程序退出。

听起来您想知道文件句柄何时“关闭”,而不一定是在该文件上运行的程序退出时

你的问题与我的工作密切相关。您可以引用它来定期轮询进程句柄以查看打开了哪些文件。这将有时间问题-首先可能需要几秒钟的时间才能打开文件

还有一些工具,例如,可能很有用

然而,这些解决方案都不是完美的。有些应用程序,包括Notepad.exe,只需打开文件,读取内容,然后立即关闭句柄。当用户单击“保存”时,将重新打开文件进行写入,内容将保存回磁盘,然后再次关闭文件句柄


更简单的方法是通过定期轮询文件上最后修改的时间戳。当它更改时,您可以假定文件已“保存”。或者将此技术与上述方法结合使用,和/或等待启动的应用程序退出。

虽然我已经写了一个答案,但这听起来像是一个错误。你到底想做什么?虽然我已经写了一个答案,但这听起来像是一个错误。你到底想做什么?没有Y变量。。。我需要知道文件何时未打开,以便我可以对其进行操作。就这么简单。我尝试过Handle.exe、ProcessExplorer、OpenedFileView等。我还实现了
NtQuerySystemInformation
。但是没有一个能检测到我用ShellExecute打开的文件。除非我做错了什么。只需创建一个普通的文本文件“test.txt”并在记事本中打开它,然后检查是否可以确定它是否已打开?问题是-ShellExecute不“打开文件”。至少不是直接的。ShellExecute启动一个应用程序,并将路径作为命令行参数传递给该应用程序。通常,启动的应用程序会快速打开文件,读入文件内容,然后关闭句柄。我相信Office应用程序倾向于在文件“打开”时保持句柄和锁,但这可能是个例外。大多数应用程序在加载文档并在屏幕上显示后,可能不会为向用户显示的文档保留文件句柄。有意义吗?我知道你可能不太愿意告诉我“Y”是什么。但是我怀疑您正在尝试实现的场景很棘手—同步文件更改是一个难题。我不会犹豫。正如我所说的。我正在打开一个文件,以便使用ShellExecute或CreateProcess进行查看或编辑。它可以是任何类型的文件。我知道ShellExecute和/或CreateProcess的功能。时间戳不起作用。但是如果文件被打开、读取和关闭(句柄关闭),那么我不知道我将要做什么。这也解释了为什么我无法检测到进程列表中的文件。@bluscape“我需要知道文件何时未打开,以便我可以对其进行操作”-请自己打开文件以进行独占访问。如果文件已打开,您的打开将失败,并导致共享冲突。如果文件尚未打开,并且打开成功,请根据需要使用该文件。没有Y变量。。。我需要知道文件何时未打开,以便我可以对其进行操作。就这么简单。我尝试过Handle.exe、ProcessExplorer、OpenedFileView等。我还实现了
NtQuerySystemInformation
。但是没有一个能检测到我用ShellExecute打开的文件。除非我做错了什么。只需创建一个普通的文本文件“test.txt”并在记事本中打开它,然后检查是否可以确定它是否已打开?问题是-ShellExecute不“打开文件”。至少不是直接的。ShellExecute启动一个应用程序,并将路径作为命令行参数传递给该应用程序。通常,启动的应用程序将快速打开f