程式開機啟動,生成的txt不在程式路徑下
阿新 • • 發佈:2019-01-08
環境:win7_64 + VS2012
程式test.exe,設定為開機啟動。test.exe中會生成length.txt,xxx.log檔案,但是僅指定了length.txt,xxx.log生成的相對路徑。
假設test.exe所在目錄,C:\Program Files (x86)\Test\test.exe,以生成length.txt程式碼片段舉例說明。
CString filePath = _T("Length.txt"); CStdioFile file; if(!file.Open(filePath, CFile::modeWrite | CFile::modeCreate | CFile::osWriteThrough |CFile::shareDenyWrite, NULL)) { SL_LOG_MSG(_T("檔案length.txt開啟失敗!")); return; };
期望length.txt生成路徑為C:\Program Files (x86)\Test\length.txt,實際開機啟動時,length.txt生成路徑為C:\Windows\SysWOW64\length.txt
猜測可能原因:作業系統啟動時環境變數path,有預設值C:\Windows\SysWOW64\。系統把相對路徑進行了拼接,最終路徑成了C:\Windows\SysWOW64\length.txt
修改方法,將相對路徑換成絕對路徑
CString filePath = _T("Length.txt"); TCHAR cExecPath[MAX_PATH]; if(!GetModuleFileName( 0, cExecPath, sizeof(cExecPath))) { return ; } CString strExePath(cExecPath); int nSeparator = strExePath.ReverseFind('\\'); strExePath = strExePath.Left(nSeparator); filePath.Format(_T("%s\\%s"),strExePath,filePath); CStdioFile file; if(!file.Open(filePath, CFile::modeWrite | CFile::modeCreate | CFile::osWriteThrough |CFile::shareDenyWrite, NULL)) { SL_LOG_MSG(_T("檔案Rodlength.txt開啟失敗!")); return; };
驗證可行。