C/C++判断文件是否已完全写入

问题描述 投票:0回答:5

我有一个目录(DIR_A)可以从服务器A转储到服务器B,它是 预计需要几周时间。 DIR_A 有正常的树 结构,即目录可以有子文件夹或文件等

目标: 由于 DIR_A 被转储到服务器 B,我将不得不 通过 DIR_A 并搜索其中的某些文件(不知道 每个文件的确切名称,因为服务器 A 更改了所有文件的名称 正在发送)。我迫不及待地要处理 DIR_A 中的一些文件。所以,我想 一旦我在服务器 B 上收到一些文件,就开始操作它们。

简介: 服务器 A 将 DIR_A 发送到服务器 B。预计需要数周时间。 我必须在上传之前开始处理 B 处的文件 完成。

尝试想法: 我决定编写一个程序来列出 DIR_A 的内容。 我继续查找DIR_A的文件夹和子文件夹中是否存在文件。 我想我可能会在 DIR_A 中查找文件的 EOF。如果不存在 那么文件尚未完全上传。我应该等到 EOF 被发现。因此,我继续循环,计算文件的大小并验证 EOF 是否存在。如果是这种情况,那么我开始处理该文件。

为了模拟上述情况,我决定编写并执行一个程序写入 一个文本文件,然后在中间停止它而不等待完成。 我尝试使用下面的程序来确定是否可以找到 EOF。我假设由于我突然结束了程序写入文本文件的操作,因此 eof 将不存在,因此不应达到输出“

EOF FOUND
”。我错了,因为这已经达到了。我也尝试过 feof() 和 fseek()。

std::ifstream file(name_of_file.c_str, std::ios::binary);
//go to the end of the file to determine eof
char character;
file.seekg(0, ios::end);
while(!file.eof()){

    file.read(character, sizeof(char));

}
file.close();
std::cout << "EOF FOUND" << std::endl

谁能提供一个判断文件是否已完全写入的想法?

c++ file eof
5个回答
2
投票

EOF 只是 C++ 告诉您没有更多数据的方式。没有 EOF“字符”可用于检查文件是否已完全写入。

通常完成此操作的方法是使用一个名称传输文件,即 myfile.txt.transferring,传输完成后,将文件移动到目标主机上(返回到 myfile.txt 等)。您可以通过使用单独的目录来执行相同的操作。


1
投票

C 和 C++ 都没有标准方法来确定文件是否仍然打开以供另一个进程写入。我们也有类似的情况:服务器向我们发送文件,我们必须尽快接收并处理它们。为此,我们使用 Linux 的

inotify
子系统,并为 IN_CLOSE_WRITE 事件配置了一个监视(文件在打开写入后关闭),该子系统被包装在 boost::asio::posix::stream_descriptor 中以实现方便的异步性。

根据操作系统的不同,您可能有类似的功能。或者只是像已经建议的那样

lsof


0
投票

所有有限文件都有一个结束。如果一个文件正在由一个进程写入,并且(假设操作系统允许)由另一个进程同时读取(比写入速度更快),则读取进程在读取完所有已写入的字符后将看到 EOF。写好了。

可能效果更好的是,如果您可以确定一段时间长度,在此期间您可以保证收到大量字节并将它们写入文件(注意操作系统缓冲),那么您可以遍历目录一次每个周期,任何改变其文件大小的文件都可以被认为是未完成。

另一种方法需要操作系统支持:使用

lsof
之类的工具检查接收进程打开了哪些文件。接收者打开的任何文件都未完成。


0
投票

在 C 中,我认为在 C++ 中也是一样,

EOF
不是一个字符;它是文件所处(或不存在)的条件。就像
media removed
network down
不是一个字符。


0
投票

这种方法在 Windows10 上适用于我:

std::ifstream loadfile(path_to_file, std::ios::binary);
if (loadfile.seekg(0, loadfile.end).tellg() != -1)  
    std::print("File is ready (copy complete)");
else
    std::print("File not ready (copy still in progress)");

将其放入循环中以所需的频率轮询状态,您将看到成功复制或传输后 Windows 复制对话框消失后,控制台输出将从“未就绪”更改为“就绪”。

© www.soinside.com 2019 - 2024. All rights reserved.