#include <string>
#include "DiskManager.h"
#include <string>
using namespace std;
const char* GetGUID()
{
static char buf[64] = {0};
memset(buf, 0, sizeof(buf));
GUID guid;
if (S_OK == ::CoCreateGuid(&guid))
{
_snprintf_s(buf, sizeof(buf)
, sizeof(buf),
"%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X"
, guid.Data1
, guid.Data2
, guid.Data3
, guid.Data4[0], guid.Data4[1]
, guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5]
, guid.Data4[6], guid.Data4[7]
);
}
return (const char*)buf;
}
CDiskManager::CDiskManager(void)
{
}
CDiskManager::~CDiskManager(void)
{
}
//可以输入任意的目录路径,函数会自动从其中解析出盘符
ULONG CDiskManager::GetFolderSpace(const char* pszPath)
{
//入参有效性检查
if (NULL == pszPath)
{
return 0;
}
std::string strPath(pszPath);
std::string strDiskRoot = strPath.substr(0, strPath.find_first_of('\\'));
if ( !IsDiskExist( strDiskRoot.c_str() ) )
{
return 0;
}
ULARGE_INTEGER i64diskFree;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;
BOOL ulRet = GetDiskFreeSpaceEx(strDiskRoot.c_str(), &i64diskFree, &TotalNumberOfBytes, &TotalNumberOfFreeBytes);
if (TRUE != ulRet)
{
return 0;
}
ULONG ulDiskFreeM = (ULONG)((i64diskFree.QuadPart / 1024) / 1024);
return ulDiskFreeM;
}
/***********************************************************************************
* name : CreateFolder
* description: 创建文件夹(可以创建风格符'\\'创建多级文件夹)
* input : NA
* output : NA
* return : NA
* remark : NA
***********************************************************************************/
bool CDiskManager::CreateFolder(const char* pszFolderPath)
{
//入参有效性检查
if (NULL == pszFolderPath)
{
return false;
}
//路径超长
if (MAX_PATH_LENGTH <= strlen(pszFolderPath))
{
return false;
}
//判断盘符是否存在
std::string strPath(pszFolderPath);
std::string strDiskRoot = strPath.substr(0, strPath.find_first_of('\\'));
if ( !IsDiskExist( strDiskRoot.c_str() ) )
{
return false;
}
// 去除字符串最后一个\ [5/8/2012 wKF71044]
std::string strTmp = pszFolderPath;
if ( strTmp.find_last_of('\\') == strTmp.size() - 1 )
{
strTmp = strTmp.substr(0, strTmp.size()-1);
}
char szDirName[MAX_PATH_LENGTH] = { 0 };
const char* pData = strTmp.c_str();
char* pszTemp = szDirName;
//BOOL result=TRUE;
/*!< 递归创建多级目录 */
while( *pData )
{
if ( ( '\\' == *pData ) || ( '/' == *pData ) )
{
if ( ':' != *( pData - 1 ) )
{
//modify by liangyihong 2012-1-6 修改前,若创建失败就返回则会出现第二级目录存在,三级目录不存在的情况下,三级目录不能创建
CreateDirectory( szDirName, NULL );
//result=CreateDirectory( szDirName, NULL );
//if (TRUE!=result)
//{
// return false;
//}
}
} // end of if ( ( '\\' == *pData ) || ( '/' == *pData ) ) ...
*pszTemp++ = *pData++;
*pszTemp = '\0';
} // end of while( *pData ) ...
return (CreateDirectory( szDirName, NULL ) == TRUE) ? true : false;
}
/***********************************************************************************
* name : IsFolderExist
* description: 判断文件夹是否存在
* input : pszFolderPath: 文件夹路径,如 D:\Capture
* output : NA
* return : bool: 文件夹是否存在
* remark : NA
***********************************************************************************/
bool CDiskManager::IsFolderExist(const char* pszFolderPath)
{
//入参有效性检查
if (NULL == pszFolderPath)
{
return false;
}
std::string strPath(pszFolderPath);
std::string strDiskRoot = strPath.substr(0, strPath.find_first_of('\\'));
if ( !IsDiskExist( strDiskRoot.c_str() ) )
{
return false;
}
//为解决根目录问题改用GetFileAttribute方法判断
DWORD dwFileAttr = GetFileAttributes(pszFolderPath);
if ((INVALID_FILE_ATTRIBUTES != dwFileAttr) && (FILE_ATTRIBUTE_DIRECTORY & dwFileAttr))
{
return true;
}
return false;
}
bool CDiskManager::IsFolderWritable(const char* pszFolderPath)
{
//入参有效性检查
if (NULL == pszFolderPath)
{
return false;
}
// 去除字符串最后一个\ [5/8/2012 wKF71044]
std::string strTmp = pszFolderPath;
if ( strTmp.find_last_of('\\') == strTmp.size() - 1 )
{
strTmp = strTmp.substr(0, strTmp.size()-1);
}
std::string strTestPath = strTmp;
strTestPath += "\\";
strTestPath += GetGUID();
BOOL bRet = CreateDirectory(strTestPath.c_str(), NULL);
if (FALSE == bRet)
{
// 拒绝访问
DWORD dError = GetLastError();
if (dError == ERROR_PATH_NOT_FOUND || dError == ERROR_ACCESS_DENIED)
{
return false;
}
}
RemoveDirectory(strTestPath.c_str());
return true;
}
/*lint -e690*/
bool CDiskManager::IsDiskExist( const char *pszDisk )
{
if ( NULL == pszDisk )
{
return false;
}
std::string strTmp = pszDisk;
char disk = pszDisk[0];
if ('a' <= disk && 'z' >= disk)
{
disk -= 32;
}
strTmp[0] = disk;
if ( strTmp.find_last_of('\\') != strTmp.size() - 1 )
{
strTmp += "\\";
}
char buf[100] = {0};
(void)GetLogicalDriveStrings(sizeof(buf)/sizeof(char),buf);
char *s = buf;
bool bFind = false;
for (; *s; s+=strlen(s)+1)
{
const char *sDrivePath = s; //单个盘符
if ( 0 == strcmp(strTmp.c_str(), sDrivePath) )
{
bFind = true;
}
}
return bFind;
}
/*lint +e690*/