2012-09-09 53 views
0

正如標題所示,在嘗試打開二進制文件(模式似乎不重要)時出現此錯誤。在磁盤上創建/打開文件返回EAGAIN

我的應用程序使用libev來處理套接字(非阻塞/ epoll後端),同時解析客戶端數據包,我希望在某些時候我收到fileupload消息,開始寫下我從服務器獲得的磁盤數據。

我不能google一下EAGAIN(Resource temporarily unavailable)消息和文件打開任何東西..

這些方法我試過:使用

  1. 的fopen(...)返回EAGAIN
  2. ofstream/fstream's open(...)通過在堆上創建它們(新)返回EAGAIN
  3. 使用ofstream/fstre我的開放(...)靜態作爲類成員(ofstream m_ofFile;)的作品,但strangly編譯器生成的代碼,它調用的流析構函數,並在退出類方法之前關閉文件im調用.open from。

    @Joachim

    你說得對,我:現在,我的C++知識,其中類成員這是類類型,析構函數前右類業主叫..

編輯矛盾m不會得到這個錯誤..(方法#1。不久將再次測試方法#2)。文件打開regulary,我得到正常的文件*。這發生在我的類的Init(...)函數中,但是當我稍後調用OnFileChunk時,m_hFile爲0,因此我無法寫入它。下面是完整的類代碼:

   class CFileTransferCS 
       { 
        wstring m_wszfile; 
        wstring m_wszLocalUserFolderPath; 
        int  m_nChunkIndex; 
        int  m_nWrittenBytes; 
        int  m_nFileSize; 
        FILE* m_hFile; 

        CFileTransferCS(const CFileTransferCS& c){} 
        CFileTransferCS& operator=(const CFileTransferCS& c){} 

       public: 

        CFileTransferCS(); 
        CFileTransferCS(wstring file, uint32_t size); 

        void OnFileChunk(char* FileChunk, int size); 
        void Init(wstring file, uint32_t size); 
        void SetLocalUserLocalPath(wstring path); 

       }; 

       CFileTransferCS::CFileTransferCS() 
       { 
        m_hFile = NULL; 
        m_wszLocalUserFolderPath = L""; 
        m_nChunkIndex = 0; 
        m_nWrittenBytes = 0; 
       } 

       CFileTransferCS::CFileTransferCS(wstring file, uint32_t size) 
       { 
        m_nChunkIndex = 0; 
        m_nWrittenBytes = 0; 

        m_wszfile = file; 
        m_nFileSize = size; 

        wstring wszFullFilePath = m_wszLocalUserFolderPath + m_wszfile.substr(m_wszfile.find_last_of(L"\\") + 1); 

        // string fp = string(file.begin(),file.end()); 
        string fp ="test.bin"; //for testing purposes 

        this->m_hFile = fopen(fp.c_str(),"wb"); 

        printf("fp: %s hFile %d\n",fp.c_str(),this->m_hFile); //everything's fine here... 

        if(!this->m_hFile) 
        { 
         perror ("cant open file "); 
        } 

       } 

       void CFileTransferCS::SetLocalUserLocalPath(wstring path) 
       { 
        m_wszLocalUserFolderPath = path; 

       } 

       void CFileTransferCS::Init(wstring file, uint32_t size) 
       { 

        // If previous transfer session got interrupted for whatever reason 
        // close and delete old file and open new one 

        if(this->m_hFile) 
        { 
         printf("init CS transfer: deleting old file///\n"); 
         fclose(this->m_hFile); 

         string fp = string(file.begin(),file.end()); 

         if(remove(fp.c_str())) 
         { 
          //cant delete file... 
         } 

        } 

        CFileTransferCS(file, size); 

       } 


       void CFileTransferCS::OnFileChunk(char* FileChunk, int size) 
       { 

        for (;;) 
        { 

         printf("ofc: hFile %d\n",this->m_hFile); //m_hFile is 0 here... 
         if(!this->m_hFile) 
         { 
          //   m_pofFile->open("kurac.txt",fstream::out); 
          printf("file not opened!\n"); 
          break; 
         } 


         int nBytesWritten = fwrite(FileChunk, 1, size, this->m_hFile); 

         if(!nBytesWritten) 
         { 
          perror("file write!!\n"); 
          break; 
         } 

         m_nWrittenBytes+=size; 

         if(m_nWrittenBytes == m_nFileSize) 
         { 
          fclose(m_hFile); 
          printf("file uplaod transfer finished!!!\n"); 
         } 


         break; 
        } 

        printf("CFileTransferCS::OnFileChunk size: %d m_nWrittenBytes: %d m_nFileSize: %d\n",size,m_nWrittenBytes,m_nFileSize); 
       } 

最後編輯:

我得到了它..呼喚明確CFileTransferCS(wstring的文件,uint32_t的大小)構造問題作出..調用構造函數像這樣明確造成這一指針它不是原來的(Init函數使用),所以當我從它打開文件並將句柄保存到m_hFile時,我在其他對象(現在我不知道如果CFileTransferCS(..)調用爲CFileTransferCS對象分配內存或者隨機地損壞其他部分內存......稍後將在IDA中檢查出它)

感謝大家和我的道歉。

的問候,邁克 -

+1

你確定它實際上是一個錯誤?請記住,如果函數成功,那麼'errno'無效。例如。在情況1中,'fopen' _did_返回'NULL'?你是否也可以顯示用於打開文件的代碼並檢查錯誤? –

+0

什麼操作系統?編譯器?現有文件/新文件?你可以創建一個小的可編譯代碼來證明問題嗎? – Bill

+0

@Bill im Debian(amd64)在編譯時使用C++ 0x開關。我總是在調用fopen/open時創建新文件。 –

回答

0

@MikeJacksons回答:

調用明確CFileTransferCS(wstring的文件,uint32_t的大小)構造製成的問題。像這樣調用構造函數明確地導致這個指針不是原來的(Init函數使用的),所以當我從它打開文件並將句柄保存到m_hFile時,我在其他對象中做了它(現在我不知道如果CFileTransferCS (..)爲CFileTransferCS對象調用分配的內存,或隨機損壞內存的其他部分..稍後將在IDA中檢查它)謝謝大家和我的道歉。

刪除:CFileTransferCS(file, size);

(無需appologize邁克,看起來就像你做的非常出色追捕的bug)。