winforms - 如何确定文件是否已打开以在 Windows 上追加?

标签 winforms file winapi msvcrt

在 UNIX 中,如果我以附加模式打开文件,例如

fd = open("filename", O_APPEND);

然后给定这样一个文件描述符,我们可以使用 fcntl 轻松找出打开它的标志:

fcntl(fd, F_GETFL) & O_APPEND

我知道 fcntl 在 Windows 上不可用,但我想知道是否有某种方法可以确定这一点。 Windows 确实支持附加模式,例如在使用 CreateFile 创建文件并传入 FILE_APPEND_DATA 标志时。

但是,如果我只有一个已打开文件的句柄,我终究无法找到一种方法来确定首次打开文件时请求的访问权限。 This question提供了检查特定文件访问权限的基本方法,但这似乎没有帮助。我试过了,即使我以只读模式打开一个文件,它仍然告诉我我拥有对该文件的 FILE_APPEND_DATA 访问权限,如果我请求它的话。换句话说,此方法仅告诉我该进程对特定文件具有哪些访问权限(从启动该进程的用户继承)。它没有说明打开文件时请求的确切访问权限。

这与 Windows 如何跟踪文件是否只应附加到无关。这是后一个问题,我无法在任何地方找到答案。我发现的最接近的是 GetFileInformationByHandleEx但是在梳理了文档之后,没有一个文件属性可以通过建议“追加模式”的 API 返回。

更新:为了更好地阐明我的问题,这个问题实际上只适用于 MS VC 运行时库——使用类似 POSIX 的函数 _open 和打开的文件用 fwrite 等写入。看起来原生 win32 文件句柄没有“追加模式”的概念。

最佳答案

对于 Windows 视为处于“附加”模式的文件,这将起作用:

使用半文档化的 NtQueryInformationFile查询 FILE_ACCESS_INFORMATION 的系统调用(从 ntdll.dll 导出) .这应该告诉您打开文件的访问掩码,其中应该包含 FILE_APPEND_DATA

但是,对于 C 运行时 在“追加”模式下打开的文件,这将不起作用,因为 Windows 实际上不会在追加模式下打开它。执行此操作的方法是以某种方式将文件描述符转换为文件对象,并检查那里的标志——但没有记录的方法来执行此操作。

您可以查看 Visual C++ CRT 源代码以了解如何执行此操作...可能有某种方法可以访问描述符索引的数组,但我不确定如何操作。
CRT 中的代码似乎是 _pioinfo(fd)->osfile |= FAPPEND,希望对您有所帮助。

关于winforms - 如何确定文件是否已打开以在 Windows 上追加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18541713/

相关文章:

c# - Mutex 失败后将窗口置于前台

perl - 如何从 Perl 控制 Windows GUI 应用程序?

c - 通过函数 : FILE* or FILE**? 的 FILE* 数组

C 从文件中读取文本并将其放入数组中

python - 使用 python 脚本从 hdfs (hadoop) 目录获取文件列表

c - 为什么我的键盘记录器不起作用?

c++ - 使用 CreateFile 打开网络文件失败并显示 FILE_NOT_FOUND

winforms - 氪星控制着谁?

c# - 如何将数据从 texboxes 插入到 datagridview?

c# - 获取 GridView 行的单元格值