DiskManager

#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*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值