Linux C++获取文件夹大小1(通过lstat实现)
2016-12-26 00:00
543 查看
项目中要计算指定文件夹的大小。
百度查到这篇文章,https://my.oschina.net/Tsybius2014/blog/330628
方法可行,运行正确。
拿到我们的项目中,却遇到一些问题:程序中一些读文件的代码,开始报异常,读不到文件。这些问题是以前没有遇到过的。
到底是什么情况呢?排查了好久,终于发现该文章提供的计算文件夹大小的函数(暂且叫做GetDirectorySize),其中有改变当前目录的代码:
我们的项目是多线程的,一个线程调用GetDirectorySize,调用的过程中改变了当前目录,而此时另一个线程使用相对路径去读文件,原来能读到的,现在就读不到了。特别提示chdir改变的是,当前进程(当然包括其下所有线程)的工作目录!!!(具体可以查看线程共享进程的那些资源?)
为了去掉GetDirectorySize的副作用,我重新实现了该函数:
百度查到这篇文章,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; }
相关文章推荐
- Windows C++ 获取文件夹大小(通过FindNextFile实现)
- linux下获取所有文件夹和文件,支持nfs和xfs(C++实现)
- Linux系统遍历文件夹 获取文件大小的操作(C语言实现)
- Linux C++ 获取文件夹大小2(通过ftw实现)
- linux下C++读取文件,获取文件大小。
- 用C#实现获取文件夹大小的源代码(收藏)
- 【C/C++】【Linux&Windows】Windows系统下的文件夹扫描与Linux系统下的实现比较
- C#实现获取文件夹大小
- C# 实现读取本地某文件夹中的html文件,然后通过正则表达式获取input控件中的id值
- 用C#实现获取文件夹大小的源代码
- 用C#实现获取文件夹大小的源代码
- C++通过写注册表实现将文件夹映射为系统虚拟盘
- C# 实现获取文件夹大小的源代码
- 嵌入式linux通过DHCP自动获取IP地址实现
- Linux 通过lseek()来实现文件大小的设置
- C++写日志源代码分析,可实现根据日期自动创建文件夹、日志分类、文件大小控制等
- BuguMongo通过BuguFS类来操作GridFS文件系统,能够实现对文件的保存、获取、删除、重命名、移动等操作,而且能够按文件夹组织文件。
- 通过WinInet API来实现表单提交并设置获取COOKIE(C++ http请求
- Linux中用C++通过管道来获取命令行输出的内容
- 嵌入式linux通过DHCP自动获取IP地址实现