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在解析之前等待文件完全写入?
不要将文件直接传输到你的程序是看的目录;而是将它们转移到同一驱动器上的不同目录中,然后在传输完成后将它们移动到监视的目录中。这样,整个文件就会在一个原子操作中出现在监视目录中。
或者,您可以在监视的目录中使用命名约定 - 为正在传输的文件附加后缀,例如“.partial”,然后在传输完成后重命名文件以删除后缀。让程序忽略名称以后缀结尾的文件。
是的,谢谢!这对程序来说似乎很好!我将转移到具有额外扩展名的目录,然后重新命名!避免部分文件问题。你是生命的救星! – user1314238 2012-04-17 01:57:41
值得注意的是,对于原子移动,您可能希望两个目录位于同一个文件系统上。 – Hugh 2012-04-17 04:37:04
这就是为什么我说“在同一个驱动器上”,虽然它不够精确。 – 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
对不起,也许我写得不好。发生的事情是文件正在从目录mydirectory /中进行处理,并且当我找到要解析的文件时,我解析所述文件,然后将其移出目录到类似mydirectoryparsed /的目录。发生的事情是,当我通过网络将新文件传输到目录中时,我的程序看起来是这些新文件,但在它们写完之前,它会尝试读取它们。这是我遇到的问题。 – user1314238 2012-04-17 01:43:56
你有没有考虑像fileReader.fail()或fileReader.isopen()等流校验? – Erwald 2012-04-17 01:46:21
有谁正在写文件拒绝阅读访问,而文件句柄是打开的。 – ildjarn 2012-04-17 01:37:44