您的位置:首页 > 编程语言 > C语言/C++

c++获取文件夹路径(不是文件哦。。。)及程序当前路径

2014-05-24 21:36 671 查看
说到文件路径,就不得不先说下“/”“\”'\'是右斜杠,也称反斜杠,一般用来表示转义,就像“\n”是换行。而我们经常用到的文件路径比如"C:\Users\Administrator"(直接得到的路径,可以从资源管理器上面得到)在程序中用字符串表示要写成“C:\\Users\\Administrator”这里的"\\"其实就是代表机器中的"\"因为我们用字符来表示他,所以要加一个‘\’进行转义,就像”换行“是用‘\n’.还有那些不能显示的ASCII字符等。当然除了上面这种写法还有一种写法就是”C:/Users/Administrator“;这边一定要看清楚了是”/“而不是”\“经常有人会把这个弄错。”/“是左斜杠,也称为正斜杠。也就是说当你在程序中要用字符串来表示文件路径时,要么你要用转义符”\\“要么用相反的正斜杠”/“来表示系统中的”\“。这样才能让系统找到你要找的文件。

说完文件路径,就来说怎么获取文件夹路径吧,在c++中获取文件路径比较简单,可以直接用文件对话框。如果要获取文件夹的路径的话就不一样了,下面直接上代码吧!

BROWSEINFO bi;
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = m_hWnd;
bi.ulFlags   = BIF_RETURNONLYFSDIRS;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
BOOL bRet = FALSE;
TCHAR szFolder[MAX_PATH*2];
szFolder[0] = _T('/0');
if (pidl)
{
if (SHGetPathFromIDList(pidl, szFolder))
bRet = TRUE;
IMalloc *pMalloc = NULL;
if (SUCCEEDED(SHGetMalloc(&pMalloc)) && pMalloc)
{
pMalloc->Free(pidl);
pMalloc->Release();
}
m_sDataSavePath = szFolder;
m_sDataSavePath.Replace("\\","/");
}


其中最后一句”m_sDataSavePath.Replace("\\","/");“非常重要,就是要对获得的”\“用”/“替换,这样不管你把路径传给另个变量还是直接保存到文件中再读取这个路径都能对他直接使用,不然的话很容易出错!也许你会很奇怪,从机器中获得的不是”C:\Users\Administrator“,,怎么是Replace("\\","/")??没错,就是用”/“代替”\\“一开始说过,”\“只能用转义字符”\\“表示,也就是说机器看的这个他就知道用”/“替换”\“,而如果你直接写Replace("\","/")的话机器是无法识别的,编译无法通过。所以这边一定要注意了。

二,文件路径的拼接

说到文件路径,我们写程序时可能进程需要将文件路径和文件名进行拼接,比如说我要将一张名为“test.jpg”的图片存放在“C:\Users\Administrator\pic”文件夹中。这时候就要用到拼接了。比如在mfc下(我用的是mfc,其他的没试过)Cstring img =“test.jpg”,Cstring filePath = “C:\\Users\\Administrator\\pic”.我想通过简单的字符串拼接得到这个文件名:cstring
file = filePath+"\\"+img;结果file的值却是“\test.jpg”,也就是说前面的路径没了!!!然后换用filePath.append(img);仍然是出现这种结果;filePath的值为“test.jpg”这显然不对。所以只好用字符数组的拼接strcat();上代码吧:

CString temStr;
char tmpc1[255];
char tmpc2[]="/myData.txt";
strcpy(tmpc1,m_sDataSavePath);
strcat(tmpc1,tmpc2);
temStr.Format("%s",tmpc1);


这样才把路径m_sDataSavePath和文件名myData.txt拼接成一个完整的文件名。最后保存就行了。。

三,程序的当前路径(即exe文件的路径)

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;
}


水平有限,如有错误敬请指出,谢谢!



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: