我可以在 C++ 中读取 Windows 中的文件而不锁定包含该文件的文件夹吗

Posted

技术标签:

【中文标题】我可以在 C++ 中读取 Windows 中的文件而不锁定包含该文件的文件夹吗【英文标题】:Can I read a file in windows in c++ without locking folder containing the file 【发布时间】:2017-05-03 11:37:52 【问题描述】:

我有一个持续读取日志文件的 c++ 程序(例如:C:/temp/file.txt)。但是,在程序运行时,我希望能够删除/重命名包含被监视文件的文件夹('temp')。

目前,我正在使用 CreateFile()。

        CreateFile(
                  szFilename,
                  GENERIC_READ,
                  FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                  NULL,
                  OPEN_EXISTING,
                  FILE_ATTRIBUTE_NORMAL,
                  NULL)

每当我删除/重命名文件夹时,都会出现以下错误: "操作无法完成,因为其中的文件夹或文件已在另一个程序中打开"

有没有办法在不锁定文件的情况下读取/打开文件?

【问题讨论】:

没办法。如果您已打开文件以在文件夹中读取,则没有其他人可以使用DELETE 访问权限打开此文件夹。但这是重命名/删除所必需的 【参考方案1】:

您可以使用CreateHardLinkW 在其他地方创建指向此文件的硬链接,然后打开它而不是原始文件。这样,原始文件(实际上也是硬链接)和包含它的文件夹可以重命名/删除,但文件本身仍然可以访问。请注意,此方法意味着对底层文件系统类型、硬链接位置和访问权限的一些限制。

【讨论】:

以上是关于我可以在 C++ 中读取 Windows 中的文件而不锁定包含该文件的文件夹吗的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中监视目录中的文件?

在 C++ 中,如何使用多个线程读取一个文件?

如何在 C++ 中读取 Windows 默认网关 IP 地址

如何从 C++/Qt 中的 .exe 和 .dlls 中读取图标(在 Windows 上)?

使用 OpenCV(C++)读取文件夹中的任何 .jpg 图像 [关闭]

无法在 Windows 中以编程方式 (C++) 从其他用户帐户读取文件