Posted on 2013-01-14 14:57
盛勝 閱讀(4561)
評(píng)論(0) 編輯 收藏 引用
http://hi.baidu.com/xiao%BF%D5%BF%D5/blog/item/3c418716a6cadf12962b4344.html
CFileDialog打開(kāi)當(dāng)前路徑
TCHAR Buffer[size];
GetCurrentDirectory(size, Buffer);
CFileDialog dlg(true,"*BIN",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "二進(jìn)制文件(*.BIN)|*.bin|All Files (*.*)|*.*|",NULL);
dlg.m_ofn.lpstrInitialDir=Buffer;
if(dlg.DoModal())
{
//your code;
}
========================
http://hi.baidu.com/g168999/blog/item/9ef3ab517977f1571038c2ba.html
VC獲取當(dāng)前程序文件的路徑,文件名以及路徑2種方法對(duì)比建議
2010-01-01 13:49
1.方法1
char pBuf[MAX_PATH]; //存放路徑的變量
GetCurrentDirectory(MAX_PATH,pBuf); //獲取程序的當(dāng)前目錄
strcat(pBuf,"http://");
strcat(pBuf,AfxGetApp()->m_pszExeName);
strcat(pBuf,".exe"); //獲取程序的全文件名
2.方法2
//函數(shù)返回應(yīng)用程序所在的路徑
CString CClientApp::ReturnPath()
{
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind('//');
sPath=sPath.Left(nPos);
return sPath;
}
3.對(duì)比及建議
方法1獲取的是程序的工作路徑,如某個(gè)程序安裝在C,D盤或者其它任何,當(dāng)你從[開(kāi)始]-[程序]后的菜單中打開(kāi)該文件,此時(shí)獲取的是用戶工作路徑,如:C:/Documents and Settings/[計(jì)算機(jī)當(dāng)前用戶名]/....../....
如果你想通過(guò)這個(gè)路徑來(lái)加載你放在程序目錄下的文件,必定出錯(cuò)。通常這種情況在你編譯調(diào)試程序時(shí)是不會(huì)出錯(cuò)的,你跟蹤得到的絕對(duì)路徑,但打包安裝后一定出問(wèn)題。
方法2獲取的是程序的絕對(duì)路徑,用這個(gè)路徑加載同目錄下的文件是不會(huì)有問(wèn)題的。
如果你要確保成功加載文件,建議使用方法2!!!!!!
新建目錄CreateDirectory
第一個(gè)參數(shù)值為文件夾名稱,第二個(gè)參數(shù)值為安全屬性,一般設(shè)置為NULL即可。如果正確創(chuàng)建,返回值為1,如果沒(méi)有正常創(chuàng)建文件夾,則返回0。
特別的:該函數(shù)每次調(diào)用時(shí)都只能創(chuàng)建一級(jí)文件夾,即文件夾中不能再包含子文件夾。 當(dāng)希望創(chuàng)建含有子文件夾的文件夾時(shí),可以先使用該函數(shù)創(chuàng)建一級(jí)文件夾,然后再使用該函數(shù)在一級(jí)文件夾下創(chuàng)建子文件夾。如: 希望創(chuàng)建:d:\\TEST\\temp, 則:CString str = “d:\\TEST”; CreateDirectory(str, NULL); str = str + \\temp; CreateDirectory(str, NULL);- CString szDir;
- szDir="C:\\temp";//臨時(shí)文件夾
- DWORD dwAttr=GetFileAttributes(szDir);
- if(dwAttr==0xFFFFFFFF) //臨時(shí)文件夾不存在則創(chuàng)建
- {
- CreateDirectory(szDir,NULL);
- )
- //.........chuli
- RemoveDirectory(szDir);//刪除文件夾
得到運(yùn)行程序所在路徑全路徑(exe或其他模塊文件名稱,程序目錄):GetModuleFileName。
函數(shù)原型:
DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); 函數(shù)參數(shù)說(shuō)明: hModule HMODULE 裝載一個(gè)程序?qū)嵗木浔H绻搮?shù)為NULL,該函數(shù)返回該當(dāng)前應(yīng)用程序全路徑。 lpFileName LPTSTR 是你存放返回的名字的內(nèi)存塊的指針,是一個(gè)輸出參數(shù) nSize DWORD ,裝載到緩沖區(qū)lpFileName的最大值 函數(shù)返回值: 如果返回為成功,將在lpFileName的緩沖區(qū)當(dāng)中返回相應(yīng)模塊的路徑,如果所設(shè)的nSize過(guò)小,那么返回僅按所設(shè)置緩沖區(qū)大小返回相應(yīng)字符串內(nèi)容。 如果函數(shù)失敗,返回值將為0,利用GetLastError可獲得異常代碼。 需要的頭文件為: windows.h
- #include <windows.h>
- #include <stdio.h>
- BOOL CreateSampleService()
- {
- TCHAR szPath[MAX_PATH];
- if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
- {
- printf("GetModuleFileName failed (%d)\n", GetLastError());
- return FALSE;
- }
- return TRUE;
- }
- <h1><a name="t2"></a>獲取程序當(dāng)前路徑GetCurrentDirectory(當(dāng)前進(jìn)程的當(dāng)前路徑,即程序?qū)嵗夸洠瑫?huì)隨著操作的改變而改變)</h1>DWORD GetCurrentDirectory(
- DWORD nBufferLength, // size of directory buffer
- LPTSTR lpBuffer // directory buffer
- );
函數(shù)功能 獲取當(dāng)前進(jìn)程的當(dāng)前目錄 參數(shù)說(shuō)明 參數(shù) 類型及說(shuō)明 nBufferLength 緩沖區(qū)的長(zhǎng)度 lpBuffer 指定一個(gè)預(yù)定義字串,用于裝載當(dāng)前目錄 返回值 調(diào)用成功 返回裝載到lpBuffer的字節(jié)數(shù)。 如nBufferLength的長(zhǎng)度不夠,不足以容納目錄,則返回值是必要的緩沖區(qū)長(zhǎng)度(要求至少這個(gè)長(zhǎng)度),其中包括空中止字符。零表示失敗。使用GetLastError函數(shù)可獲得錯(cuò)誤信息謹(jǐn)記:CFileDialog會(huì)改變程序的默認(rèn)執(zhí)行路徑,比較穩(wěn)妥的辦法還是絕對(duì)路徑來(lái)訪問(wèn)文件比較好。在程序剛一跑起來(lái)的時(shí)候,先用GetCurrentDirectory()或是GetModuleFileName()獲得當(dāng)前可執(zhí)行文件所在的路徑,并保存起來(lái)。以后即使是用CFileDialog改變了當(dāng)前的路徑,也能很容易地找回來(lái)。
- CFileDialog Dlg(TRUE,NULL,NULL,0,"ASCII Data Files(*.asc)|*.asc|所有文件 (*.*)|*.*||");
- char pBuf[MAX_PATH]; //存放路徑的變量
-
- GetCurrentDirectory(MAX_PATH,pBuf); //獲取程序的當(dāng)前目錄
-
- strcat(pBuf,"\\");
-
- CString strtemp=pBuf;
-
-
- Dlg.m_ofn.lpstrInitialDir=pBuf;