做程序,经常会和各种文件的路径打交道。相关的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 nameLPSECURITY_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/123CString strTempPath = "C://Test//321";CreateDirectory(strTempPath,NULL);strTempPath = "C://Test//321//123";CreateDirectory(strTempPath,NULL);这样,就可以了。