获取目录的大小函数linux,Linux C++获取文件夹大小1(通过lstat实现)
拿到我們的項(xiàng)目中,卻遇到一些問題:程序中一些讀文件的代碼,開始報(bào)異常,讀不到文件。這些問題是以前沒有遇到過的。
到底是什么情況呢?排查了好久,終于發(fā)現(xiàn)該文章提供的計(jì)算文件夾大小的函數(shù)(暫且叫做GetDirectorySize),其中有改變當(dāng)前目錄的代碼:
chdir(dir);
我們的項(xiàng)目是多線程的,一個線程調(diào)用GetDirectorySize,調(diào)用的過程中改變了當(dāng)前目錄,而此時另一個線程使用相對路徑去讀文件,原來能讀到的,現(xiàn)在就讀不到了。特別提示chdir改變的是,當(dāng)前進(jìn)程(當(dāng)然包括其下所有線程)的工作目錄!!!(具體可以查看線程共享進(jìn)程的那些資源?)
為了去掉GetDirectorySize的副作用,我重新實(shí)現(xiàn)了該函數(shù):
#include
#include
#include
#include
#include
#include
#include
//計(jì)算某目錄所占空間大小(包含本身的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;
}
總結(jié)
以上是生活随笔為你收集整理的获取目录的大小函数linux,Linux C++获取文件夹大小1(通过lstat实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux比较两个文件md5,linux
- 下一篇: linux mrtg 进程名称,Linu