zoukankan      html  css  js  c++  java
  • Linux 与 Windows 计算文件夹大小

    void UTIL_CountFileSize(const char *dir, long &fsize)
    {
    #ifndef WIN32
        DIR *dp;
        struct dirent *entry;
        struct stat statbuf;
        
        if((dp = opendir(dir)) == NULL)
        {
            fprintf(stderr ,"cannot open dirctory : %s \n", dir);
            return ;
        }
        chdir(dir);//注意这里改变了工作路径
        while((entry = readdir(dp)) != NULL)
        {
            lstat(entry->d_name, &statbuf);
            if(S_ISDIR(statbuf.st_mode))
            {
                if(strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0)
                {
                    continue;
                }
                else
                {
                    fsize += statbuf.st_size;
                    UTIL_CountFileSize(entry->d_name, fsize);
                }
            }
            fsize += statbuf.st_size;
            
        }
        chdir("..");//needed 
        closedir(dp);
    #else

        char szFind[MAX_PATH];
        char szFileTemp[MAX_PATH];
        WIN32_FIND_DATA FindFileData;

        strcpy(szFind,dir);
        strcat(szFind,"\\*.*");

        int actcnt = MultiByteToWideChar(CP_ACP, NULL, szFind, -1, NULL, 0);
        TCHAR * pbuffer = new TCHAR[actcnt + 1];
        memset(pbuffer, 0sizeof(pbuffer));
        MultiByteToWideChar(CP_ACP, NULL, szFind, -1, pbuffer, actcnt);

        HANDLE hFind = ::FindFirstFile(pbuffer ,&FindFileData);
        if(INVALID_HANDLE_VALUE == hFind)   
            return;
       
        while(TRUE)
        {
            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if(FindFileData.cFileName[0]!='.')
                {                                  
                    DWORD dwMinSize = WideCharToMultiByte (CP_OEMCP, NULL, FindFileData.cFileName ,-1, NULL, 0, NULL, 0);
                    char *cTemp =  new char[dwMinSize + 1];
                    memset(cTemp, 0 , sizeof(cTemp));
                    WideCharToMultiByte (CP_OEMCP, NULL, FindFileData.cFileName ,-1, cTemp, sizeof(FindFileData.cFileName)/sizeof(FindFileData.cFileName[0]), NULL, 0);
                    sprintf(szFileTemp,"%s\\%s", dir, cTemp);                              
                    UTIL_CountFileSize(szFileTemp,fsize);                
                }
            }
            else
            {
                fsize += (long) FindFileData.nFileSizeLow;            
            }
            if(!FindNextFile(hFind,&FindFileData))    break;
        }
        FindClose(hFind);

    #endif
    }

    其中以下代码是 WCHAR 与 char * 之间的转换 (参考前一篇文章

      int actcnt = MultiByteToWideChar(CP_ACP, NULL, szFind, -1, NULL, 0);
        TCHAR * pbuffer = new TCHAR[actcnt + 1];
        memset(pbuffer, 0sizeof(pbuffer));

        MultiByteToWideChar(CP_ACP, NULL, szFind, -1, pbuffer, actcnt); 

    相反转换

    DWORD dwMinSize = WideCharToMultiByte (CP_OEMCP, NULL, FindFileData.cFileName ,-1, NULL, 0, NULL, 0);
                    char *cTemp =  new char[dwMinSize + 1];
                    memset(cTemp, 0 , sizeof(cTemp));
                    WideCharToMultiByte (CP_OEMCP, NULL, FindFileData.cFileName ,-1, cTemp, sizeof(FindFileData.cFileName)/sizeof(FindFileData.cFileName[0]), NULL, 0);
  • 相关阅读:
    创建Hive/hbase相关联的表异常
    CDH5.2+CM5.2+impala2+Spark1.1 集群搭建基础环境准备
    【JavaWeb】(10)微信公众号开发进阶
    Ambari-stack介绍
    OSGi中的ServletContext
    笔试面试1 用C实现C库函数itoa, atoi
    SGU 114. Telecasting station 三分or找中位数
    face++实现人脸识别
    磁盘接口与磁盘扫描
    CSDN开源夏令营 百度数据可视化实践 ECharts(4)
  • 原文地址:https://www.cnblogs.com/no7dw/p/2364093.html
Copyright © 2011-2022 走看看