您的位置:首页 > 运维架构 > Linux

Linux C++获取文件夹大小1(通过lstat实现)

2016-12-26 00:00 543 查看
项目中要计算指定文件夹的大小。
百度查到这篇文章,https://my.oschina.net/Tsybius2014/blog/330628
方法可行,运行正确。

拿到我们的项目中,却遇到一些问题:程序中一些读文件的代码,开始报异常,读不到文件。这些问题是以前没有遇到过的。
到底是什么情况呢?排查了好久,终于发现该文章提供的计算文件夹大小的函数(暂且叫做GetDirectorySize),其中有改变当前目录的代码:

chdir(dir);

我们的项目是多线程的,一个线程调用GetDirectorySize,调用的过程中改变了当前目录,而此时另一个线程使用相对路径去读文件,原来能读到的,现在就读不到了。特别提示chdir改变的是,当前进程(当然包括其下所有线程)的工作目录!!!(具体可以查看线程共享进程的那些资源?
为了去掉GetDirectorySize的副作用,我重新实现了该函数:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>

//计算某目录所占空间大小(包含本身的4096Byte)
long long int GetDirectorySize(char *dir)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
long long int totalSize=0;

if ((dp = opendir(dir)) == NULL)
{
fprintf(stderr, "Cannot open dir: %s\n", dir);
return -1; //可能是个文件,或者目录不存在
}

//先加上自身目录的大小
lstat(dir, &statbuf);
totalSize+=statbuf.st_size;

while ((entry = readdir(dp)) != NULL)
{
char subdir[256];
sprintf(subdir, "%s/%s", dir, entry->d_name);
lstat(subdir, &statbuf);

if (S_ISDIR(statbuf.st_mode))
{
if (strcmp(".", entry->d_name) == 0 ||
strcmp("..", entry->d_name) == 0)
{
continue;
}

long long int subDirSize = GetDirectorySize(subdir);
totalSize+=subDirSize;
}
else
{
totalSize+=statbuf.st_size;
}
}

closedir(dp);
return totalSize;
}

int main(int argc, char* argv[])
{
char* dir = argv[1];
long long int  totalSize = GetDirectorySize(dir);
printf("totalSize: %lld\n", totalSize);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息