当前位置首页 > 百科> 正文

MakeSureDirectoryPathExists

2021-06-09 14:27:56 百科

MakeSureDirectoryPathExists

MakeSureDirectoryPathExists是一种函式,该函式的作用是检查指定目录是否存在,如果不存在则创建整个Dirpath所表示的整个目录。

函式原型

BOOL MakeSureDirectoryPathExists(
PCSTR Dirpath
);

参数

Dirpath:要检查的目录名。如果是路径不是档案名称,需以 '\' 结尾。

返回值

如果目录存在,返回TRUE;如果不存在但全部路径创建成功,返回TRUE;
如果不存在且创建失败,返回FALSE。

函式使用

一次性建立多级目录(用CreateDirectory只能一级一级的建立)。
如:
MakeSureDirectoryPathExists( "c:\\a\\b\\ ");
如果a资料夹不存在也可以创建成功。
这个函式并不存在于 Kernel32.dll 中,需要包含头档案imagehlp.h,并连结imagehlp.lib。
该函式的实现如下,以供使用和学习。
LPTSTR _tCharAlloc(UINT uSize){    return (LPTSTR)malloc(sizeof(TCHAR) * uSize);}VOID _tCharFree(LPVOID p){    free(p);}#define IMAGEAPI WINAPIBOOL IMAGEAPI MakeSureDirectoryPathExists(LPCTSTR pszDirPath){    LPTSTR p, pszDirCopy;    DWORD dwAttributes;    // Make a copy of the string for editing.    __try    {        pszDirCopy = (LPTSTR)_tCharAlloc(lstrlen(pszDirPath) + 1);        if (pszDirCopy == NULL)            return FALSE;        lstrcpy(pszDirCopy, pszDirPath);        p = pszDirCopy;        //  If the second character in the path is "\", then this is a UNC        //  path, and we should skip forward until we reach the 2nd \ in the path.        if ((*p == TEXT('\\')) && (*(p + 1) == TEXT('\\')))        {            p++;            // Skip over the first \ in the name.            p++;            // Skip over the second \ in the name.            //  Skip until we hit the first "\" (\\Server\).            while (*p && *p != TEXT('\\'))            {                p = CharNext(p);            }            // Advance over it.            if (*p)            {                p++;            }            //  Skip until we hit the second "\" (\\Server\Share\).            while (*p && *p != TEXT('\\'))            {                p = CharNext(p);            }            // Advance over it also.            if (*p)            {                p++;            }        }        else if (*(p + 1) == TEXT(':')) // Not a UNC.  See if it's <drive>:        {            p++;            p++;            // If it exists, skip over the root specifier            if (*p && (*p == TEXT('\\')))            {                p++;            }        }        while (*p)        {            if (*p == TEXT('\\'))            {                *p = TEXT('\0');                dwAttributes = GetFileAttributes(pszDirCopy);                // Nothing exists with this name.  Try to make the directory name and error if unable to.                if (dwAttributes == 0xffffffff)                {                    if (!CreateDirectory(pszDirCopy, NULL))                    {                        if (GetLastError() != ERROR_ALREADY_EXISTS)                        {                            _tCharFree(pszDirCopy);                            return FALSE;                        }                    }                }                else                {                    if ((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)                    {                        // Something exists with this name, but it's not a directory... Error                        _tCharFree(pszDirCopy);                        return FALSE;                    }                }                *p = TEXT('\\');            }            p = CharNext(p);        }    }    __except (EXCEPTION_EXECUTE_HANDLER)    {        // SetLastError(GetExceptionCode());        _tCharFree(pszDirCopy);        return FALSE;    }    _tCharFree(pszDirCopy);    return TRUE;}
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net