【问题标题】:C++ ifstream tries to open file while being writtenC++ ifstream 尝试在写入时打开文件
【发布时间】:2012-04-17 01:36:51
【问题描述】:

我不断地在一个目录中轮询文件,每次我看到一个满足某些读取标准的文件时,我都会打开该文件并对其进行解析。

string newLine;

ifstream fileReader;

fileReader.open(filename.c_str());

while(!fileReader.eof())
{
getline(fileReader, newLine);
    // do some stuff with the line...
}
filereader.close();

上面的代码在一个循环中,每 1 秒运行一次,检查目录中的新文件。我的问题是,当我将文件传输到文件夹中进行处理时,我的循环找到了文件并将文件名传递给 ifstream,然后 ifstream 打开它并尝试解析一个不完整的文件。如何让 ifstream 等到文件写入完成后再尝试解析文件?

编辑: 想在这里更好地表达这个问题,因为回复者似乎误解了我的问题。我有 2 个目录

mydirectory/
mydirectoryParsed/

我的代码的工作方式是我的程序检查 mydirectory/ 中的文件,当它找到它们时,解析它们并使用文件中的信息。没有写入文件。完成文件解析后,文件将移动到 mydirectoryparsed/

问题是,当我通过网络将文件传输到 mydirectory/ 时,ifstream 会在传输过程中看到这些文件,并在它们完成写入目录之前开始读取它们。如何让 ifstream 等到文件完全写入后再解析?

【问题讨论】:

  • 在文件句柄打开时让写入文件的人拒绝读取访问权限。

标签: c++ file-io locking ifstream


【解决方案1】:

不要将文件直接传输到程序正在观看的目录中;相反,将它们转移到同一驱动器上的不同目录中,然后在转移完成后将它们移动到监视目录中。这样,完整的文件就会在单个原子操作中出现在被监视的目录中。

或者,您可以在监视目录中使用命名约定 — 将“.partial”之类的后缀附加到正在传输的文件中,然后在传输完成后重命名文件以删除后缀。让您的程序忽略名称以后缀结尾的文件。

【讨论】:

  • 好的,谢谢!这似乎对程序有好处!我将转移到具有额外扩展名的目录,然后重命名!避免部分文件问题。你是救生员!
  • 值得注意的是,对于原子移动,您可能希望两个目录位于同一文件系统上。
  • 这就是我说“在同一个驱动器上”的原因,虽然它不太准确。
【解决方案2】:

您不应该在每次写入文件时都打开该文件。打开一次!

一些伪代码是:

1- Open file
2- Get the data you want to write, treat that data
3- Call the write to file function
4- Loop until you have nothing left to write
5- Close de file

【讨论】:

  • 对不起,我可能措辞不佳。正在发生的事情是正在从目录 mydirectory/ 处理文件,当我找到要解析的文件时,我解析所述文件,然后将其从目录中移出到 mydirectoryparsed/ 之类的目录中。发生的事情是,当我通过网络将新文件传输到目录中时,我的程序似乎是这些新文件,但在它们完成写入之前,它会尝试读取它们。这就是我遇到问题的地方。
  • 您是否考虑过类似 fileReader.fail() 或 fileReader.isopen() 等的流验证?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多