做程序,经常会和各种文件的路径打交道。相关的API也很多。但有几点要注意的。
1。
DWORD GetCurrentDirectory(
DWORD nBufferLength, // size of directory buffer
LPTSTR lpBuffer // directory buffer
);
这个API函数大家不陌生吧。我以前经常用这个函数来取得当前程序的目录。但是,这个函数,得到的是当前进程的活动目录。并不一定是程序EXE文件的目录。很多操作,都会影响该函数取得的值。
比如,程序开始后,打开过某个文件,或者选择过某个路径,都会影响到CurrentDirectory。所以,想要取得EXE文件所在的目录,最好使用下面的函数:
DWORD GetModuleFileName( HMODULE hModule, // handle to module LPTSTR lpFilename, // path buffer DWORD nSize // size of buffer );
这个API可以得到EXE的路径。但得到的路径中,包括了EXE文件本身。比如,程序在C:/Test/Win32.exe,那么得到的路径,会包含"Win32.exe"文件名在内。我们可以使用另一个API去掉路径中的文件名。
BOOL PathRemoveFileSpec(
LPTSTR pszPath
);
Removes the trailing file name and backslash from a path, if it has them.
需要注意的是,这个API需要引用下面的库。
Header: Declared in Shlwapi.h.
Import Library: Shlwapi.lib.
这样,得到的当前路径,就很保险。
2。
BOOL CreateDirectory(
LPCTSTR lpPathName, // directory name
LPSECURITY_ATTRIBUTES lpSecurityAttributes // SD
);
关于这个API,可以用来创建路径。或者说创建文件夹。
但有一点要注意,创建的路径,不能是多重路径。也就是说,该函数只能创建已存在的路径下的一级路径。
举个例子:
若C:/Test 已经存在。如果调用该API:
CString strTempPath = "C://Test//123";
CreateDirectory(strTempPath,NULL);
则可以成功在C:/Test 下创建123文件夹。
但如果
CString strTempPath = "C://Test//321//123";
CreateDirectory(strTempPath,NULL);
则创建失败!
因为,C:/Test/321这个路径并不存在。CreateDirectory只能创建一层路径。
所以,要先创建C:/Test/321,再创建C:/Test/321/123
CString strTempPath = "C://Test//321";
CreateDirectory(strTempPath,NULL);
strTempPath = "C://Test//321//123";
CreateDirectory(strTempPath,NULL);
这样,就可以了。
本文介绍了如何准确地获取程序所在目录及文件路径,并详细解释了创建目录的API使用技巧,特别是针对多级目录创建的注意事项。

被折叠的 条评论
为什么被折叠?



