1. 程式人生 > >程式開機啟動,生成的txt不在程式路徑下

程式開機啟動,生成的txt不在程式路徑下

環境: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;
    };

驗證可行。