Windows下c++统计某文件夹下所有文件夹的大小


 

char* rtrim_lc(char* s)
{
char* s_s = new char[strlen(s) + 1];
strcpy(s_s, s);
//
int s_len = strlen(s_s);
//bool lastBspace = false;
bool bLastHasSpace = false; //最后有空格标志
if (s_s[s_len - 1] == ' ')
bLastHasSpace = true;
if (bLastHasSpace)
{
for (int i = s_len - 1; i >= 0; i--)
{
if (s_s[i] == ' ')
{
s_s[i] = '\0';
}
else
break;
}
}
char* d_s = new char[strlen(s_s)];
strcpy(d_s, s_s);
return d_s;
}

//去掉字符串首(左)空格函数
char* ltrim_lc(char* s)
{
char* s_s = new char[strlen(s) + 1];
strcpy(s_s, s);
char* s_rev = _strrev(s_s);
s_rev = rtrim_lc(s_rev);
char* d_s = _strrev(s_rev);
return d_s;
}

 

void getFolder(string path, map<string, string>& subfolders, bool bRecursive = false)
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
//如果是目录
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
{
if (bRecursive)
getFolder(p.assign(path).append("\\").append(fileinfo.name), subfolders, bRecursive);
subfolders.insert(map<string, string>::value_type(fileinfo.name, p.assign(path).append("\\").append(fileinfo.name)));

}
}

} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}

char* stringToChar(string src)
{
char *dst = new char[1024];
int i;
for (i = 0; i <= src.length(); i++)
dst[i] = src[i];
dst[i] = '\0';
return dst;
}

 

int main(int argc, char **argv)
{
char * filePath = "D:\\test";
char * storefile = "D:\\foldersize_print.txt";
if (argc >= 2)
filePath = argv[1];
if (argc >= 3)
storefile = argv[2];

map<string, string> subfolders;
getFolder(filePath, subfolders,false);

FILE* fp1 = NULL;
FILE* fp2 = NULL;


char a[1024] = { 0 };
char aDUse[1024] = { 0 };
bool bFindKey = false;
int i = 0;

int size = subfolders.size();
if ((fp1 = fopen(storefile, "w")) != NULL)
{
string tmpStr;
string tmpStrFolder;
string tmpfilename;
for (map<string, string>::iterator itF = subfolders.begin(); itF != subfolders.end(); itF++)
{

tmpfilename = filePath;
tmpfilename = tmpfilename + "\\";
tmpfilename = tmpfilename + (*itF).first;
tmpfilename = tmpfilename + ".txt";
tmpStr = (*itF).second;
tmpStrFolder = "dir /s " + tmpStr;
tmpStrFolder = tmpStrFolder + ">";
tmpStrFolder = tmpStrFolder + tmpfilename;

char* pTmpChar = stringToChar(tmpStrFolder);
system(pTmpChar);
delete[] pTmpChar;
char* pTmpFile = stringToChar(tmpfilename);
if ((fp2 = fopen(pTmpFile, "r")) != NULL )
{
i = 0;
while (fgets(a, 1024, fp2) != NULL)
{
memset(aDUse, 0, 1024); //需要初始化为0
memcpy(&aDUse, a, strlen(a));
char* tmp = ltrim_lc(aDUse);
int res = -1;
//处理每行
res = strcmp(tmp, "所列文件总数:\n");
if (res == 0)
{
bFindKey = true;
i++;
continue;

}
if (bFindKey)
{
char* ptemp = stringToChar((*itF).first);
fwrite(ptemp, strlen(ptemp), 1, fp1);
delete[] ptemp;
fwrite(a, strlen(a), 1, fp1);
bFindKey = false;
break;
}

i++;
}

fclose(fp2);
}

delete[] pTmpFile;
tmpStrFolder = "del /Q ";
tmpStrFolder += tmpfilename;
char* pTmp = stringToChar(tmpStrFolder);
system(pTmp);
delete[] pTmp;

}

fclose(fp1);
}

return 0;
}

//思路: 先遍历所有文件夹,利用dir命令获取文件夹信息后写文件,然后读文件获取文件夹大小后,再写入最后的统计文件

//本人在VS2013下编写,部分代码曾参考网上大虾的

//欲统计下列文件夹 

//最终统计结果

 //以下是通过属性直接查看的

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM