0

我有一个目录 ( 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

谁能提供确定文件是否已完全写入的想法?

4

4 回答 4

2

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

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

于 2010-09-10T18:46:01.307 回答
0

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

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

另一种方法需要操作系统支持:检查接收进程打开了哪些文件,使用lsof. 接收方打开的任何文件都未完成。

于 2010-09-10T18:52:15.847 回答
0

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

于 2010-09-10T18:46:46.717 回答
0

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

根据操作系统,您可能有类似的设施。或者就像lsof已经建议的那样。

于 2010-09-10T18:56:25.023 回答