C++目录监视-如何检测副本已结束
C++ Directory Watching - How to detect copy has ended
我有一个文件复制到的文件夹。我想观察它,并在文件复制到目录后立即处理它们。我可以检测文件何时在目录中,无论是通过轮询(我当前的实现)还是在一些测试中使用我在网上找到的一些示例中的Windows API。
问题是,我检测到文件是何时首次创建的,并且它仍在复制中。这使得我的程序,需要访问文件,通过错误(因为文件还不完整)。如何不检测复制何时开始,而是检测复制何时结束?我在Windows上使用C++,所以答案可能取决于平台,但如果可能的话,我更希望它与平台无关。
您可以使用锁定文件或特殊的命名约定。最简单的是后者,其工作原理如下:
假设您想移动一个名为"fileA.txt"的文件,当将其复制到目标目录时,请将其复制至"fileA.txt.partial"或类似的位置。复制完成后,将文件从"fileA.txt.partial"重命名为"fileA.txt"。因此,就观看程序所见,"fileA..txt"的外观是原子的。
前面提到的另一个选项是锁定文件。因此,当你复制一个名为"fileA.txt"的文件时,你首先创建一个名"fileA.txt.lock"的文件。复制完成后,你只需删除锁定文件。当观看程序看到"fileA.txt"时,它应该检查"fileA.txt.lock"是否存在,如果存在,它可以等待或在未来根据需要重新访问该文件。
您不应该进行轮询。使用FindFirstChangeNotification(http://msdn.microsoft.com/en-us/library/windows/desktop/aa364417%28v=vs.85%29.aspx)以监视目录的更改。
然后使用等待功能(http://msdn.microsoft.com/en-us/library/windows/desktop/ms687069%28v=vs.85%29.aspx)等待更改通知发生。
概述和示例如下:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365261%28v=vs.85%29.aspx
我不确定如何准确地确定文件写入完成。Evan Teran的回答是个好主意。
你可以使用这样的东西,这是经过测试和工作的
bool IsFileDownloadComplete(const std::wstring& dir, const std::wstring& fileName)
{
std::wstring originalFileName = dir + fileName;
std::wstring tempFileName = dir + L"temp";
while(true)
{
int ret = rename(convertWstringToString(originalFileName).c_str(), convertWstringToString(tempFileName).c_str());
if(ret == 0)
break;
Sleep(10);
}
/** File is not open. Rename to original. */
int ret = rename(convertWstringToString(tempFileName).c_str(), convertWstringToString(originalFileName).c_str());
if(ret != 0)
throw std::exception("File rename failed");
return true;
}
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 用callgrind追踪不必要的副本
- 落砂模拟碰撞检测C++和SFML
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 为什么C++编译器没有检测到正确声明的类?
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检测win32服务创建和删除的最佳方法
- 正在LLVM中检测整数比较条件
- 检查注册表项是否链接到(或副本)另一个注册表项
- 如何在鼠标挂钩过程中检测拖动
- 在已删除的副本分配中检测到虚假错误
- C++目录监视-如何检测副本已结束
- 可以闪存检测正在拍摄的屏幕截图(或GDI位副本)
- C++ : 如何检测矢量中的重复项<string>并打印一份副本?