C / C ++确定文件是否已完全写入

时间:2010-09-10 18:41:24

标签: c++ process eof complete

我有一个目录( 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。我假设因为我abrubtly结束了写入文本文件的程序,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

是否有人可以提供确定文件是否已完全写入的想法?

由于

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

C中,我认为C++中的情况相同,EOF不是字符;这是文件是(或不是)的条件。就像media removednetwork down不是字符一样。

答案 2 :(得分:0)

所有有限文件都有结束。如果一个进程正在写入一个文件,并且(假设操作系统允许它)同时读取(比正在写入的速度快)另一个进程,那么当读取所有已经读过的字符时,读取进程将看到EOF写入。

如果你可以确定一段时间可以保证你会收到大量的字节并将它们写入文件(谨防操作系统缓冲),那么你可以更好地工作。目录每个句点一次,并且任何已更改其文件大小的文件都可以视为未完成。

另一种方法需要操作系统支持:使用lsof等工具检查接收过程打开的文件。接收方打开的任何文件都未完成。

答案 3 :(得分:0)

C和C ++都没有标准的方法来确定文件是否仍然可以被另一个进程写入。我们有类似的情况:一个向我们发送文件的服务器,我们必须尽快接收并处理。为此,我们使用Linux的inotify子系统,为IN_CLOSE_WRITE事件配置了一个监视(文件在打开后写入时关闭),它包含在boost :: asio :: posix :: stream_descriptor中,以方便异步。 / p>

根据操作系统的不同,您可能拥有类似的设施。或者只是已经建议的lsof