正如標題所示,在嘗試打開二進制文件(模式似乎不重要)時出現此錯誤。在磁盤上創建/打開文件返回EAGAIN
我的應用程序使用libev來處理套接字(非阻塞/ epoll後端),同時解析客戶端數據包,我希望在某些時候我收到fileupload消息,開始寫下我從服務器獲得的磁盤數據。
我不能google一下EAGAIN(Resource temporarily unavailable)
消息和文件打開任何東西..
這些方法我試過:使用
- 的fopen(...)返回
EAGAIN
- ofstream/fstream's open(...)通過在堆上創建它們(新)返回
EAGAIN
- 使用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中檢查出它)
感謝大家和我的道歉。
的問候,邁克 -
你確定它實際上是一個錯誤?請記住,如果函數成功,那麼'errno'無效。例如。在情況1中,'fopen' _did_返回'NULL'?你是否也可以顯示用於打開文件的代碼並檢查錯誤? –
什麼操作系統?編譯器?現有文件/新文件?你可以創建一個小的可編譯代碼來證明問題嗎? – Bill
@Bill im Debian(amd64)在編譯時使用C++ 0x開關。我總是在調用fopen/open時創建新文件。 –