C++ ifstream试图在写入时打开文件

问题描述:

我不断查询一个文件目录,并且每次看到符合某些读取条件的文件时,我都会打开该文件并对其进行解析。C++ ifstream试图在写入时打开文件

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在文件完成写入之前等待,直到它试图解析文件?

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

mydirectory/ 
mydirectoryParsed/ 

的方式我的代码工作原理是,我在mydirectory中的文件程序检查/当它发现它们,分析它们,并使用在文件中的信息。没有写入文件完成。一旦我完成解析文件,文件被移动到mydirectoryparsed/

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

+0

有谁正在写文件拒绝阅读访问,而文件句柄是打开的。 – ildjarn 2012-04-17 01:37:44

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

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

+0

是的,谢谢!这对程序来说似乎很好!我将转移到具有额外扩展名的目录,然后重新命名!避免部分文件问题。你是生命的救星! – user1314238 2012-04-17 01:57:41

+1

值得注意的是,对于原子移动,您可能希望两个目录位于同一个文件系统上。 – Hugh 2012-04-17 04:37:04

+1

这就是为什么我说“在同一个驱动器上”,虽然它不够精确。 – Wyzard 2012-04-17 05:02:06

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

一些这方面的伪代码将是:

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 
+0

对不起,也许我写得不好。发生的事情是文件正在从目录mydirectory /中进行处理,并且当我找到要解析的文件时,我解析所述文件,然后将其移出目录到类似mydirectoryparsed /的目录。发生的事情是,当我通过网络将新文件传输到目录中时,我的程序看起来是这些新文件,但在它们写完之前,它会尝试读取它们。这是我遇到的问题。 – user1314238 2012-04-17 01:43:56

+0

你有没有考虑像fileReader.fail()或fileReader.isopen()等流校验? – Erwald 2012-04-17 01:46:21