释放QFile创建的文件

时间:2013-10-30 04:22:10

标签: qt dll fortran

CASE

  1. 我的Qt应用程序通过QFile创建文件
  2. 我打算用dll来读取这个文件
  3. 症状

    • dll无法使用它,因为它被QAppilcation 占用

    ATTEMPT

    1. 我尝试了file.close()来释放文件,但是没有用;
    2. 我尝试了其他应用程序来读取此文件,其症状与占用相同 意思是dll很好。
    3. 那么,我该怎样做才能发布已经由QFile创建和关闭的文件?

      发布Qt文件

          void MainWindow::creatFile(){
             QFile file("1.dat");
             if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                 return ;
      
             if(!file.exists())
                 return;
      
             QTextStream out(&file);
             out << "test" <<endl;
      
             out.flush();
             file.close(); // .~QFile() is not needed at all.
             return;
         }
      

      将QString转换为Character(Fortran)

      typedef void (* myfun)(char string[255]); //How Qt pass character to Fortran dll
      
      //QString-> std::string -> char* 
      std::string fileName_std = fileName.replace("/","\\").toStdString();
      const char* fileName_cstr = fileName_std.c_str();
      
      char fileName_For90[255];
      int length = sizeof(fileName_For90); 
      
      //fill the left nulls of char with blanks which are required in Fortran
      strcpy(fileName_For90,fileName_cstr);
      for(int i = strlen(fileName_For90); i < length; i++){
          fileName_For90[i] = ' '; 
      }
      

2 个答案:

答案 0 :(得分:0)

(这个问题在评论中有答案并编辑到问题中。问题有重复编辑,更像是一个博客而不是一个问题,而且不再清楚问题是什么,而SO期望一个明确的问题和明确的答案。请参阅Question with no answers, but issue solved in the comments (or extended in chat)。我正在将此社区Wiki回答,以便将问题记录为已回答,但我发现很难从所有聊天和编辑中提取答案。)

OP写道:

  

以下是我在解决过程中得到的结果:

     
      
  1. .close()实际上关闭了该文件。可能需要.flush(),因为您可以在QFile::flush() vs QFile::close()
  2. 找到详细信息   
  3. 真正的问题在于将Fortran中的QString转换为Character
  4.   

答案 1 :(得分:0)

我建议使用QSaveFile。我遇到了许多尝试创建文件的实例,然后立即引用和使用它可能会导致此问题。 QSaveFile在临时空间中创建文件并将其移动到它的最终目的地。当其他函数或信号流程需要对文件起作用时,这似乎更具确定性。这对于QFileSystemWatcher来说尤其如此。

void MainWindow::createFile(){
   QSaveFile file("1.dat");
   if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
       return ;

   if(!file.exists())
       return;

   QTextStream out(&file);
   out << "test" <<endl;

   out.flush();
   file.commit(); // .~QFile() is not needed at all.
   return;

}