拿到我们的项目中,却遇到一些问题:程序中一些读文件的代码,开始报异常,读不到文件。这些问题是以前没有遇到过的。

到底是什么情况呢?排查了好久,终于发现该文章提供的计算文件夹大小的函数(暂且叫做GetDirectorySize),其中有改变当前目录的代码:

chdir(dir);

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

为了去掉GetDirectorySize的副作用,我重新实现了该函数:

#include

#include

#include

#include

#include

#include

#include

//计算某目录所占空间大小(包含本身的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;

}

获取目录的大小函数linux,Linux C++获取文件夹大小1(通过lstat实现)相关推荐

  1. linux按照目录大小降序排列,Linux du命令查看文件夹大小并按降序排列

    1. df -lh 2. du -s /usr/* | sort -rn 这是按字节排序 3. du -sh /usr/* | sort -rn 这是按兆(M)来排序 4.选出排在前面的10个 du ...

  2. Linux中查看各文件夹大小(扫盘)

    df -h ./ du -hs ./ du -h /ifs4/BC_RD/USER/lizhixin/my_project/human_chr22 | grep [[:digit:]+]G du [- ...

  3. linux du命令 前多少个,Linux du命令查看文件夹大小并按降序排列

    1. df -lh 2. du -s /usr/* | sort -rn 这是按字节排序 3. du -sh /usr/* | sort -rn 这是按兆(M)来排序 4.选出排在前面的10个 du ...

  4. Linux中查看各文件夹大小命令du -h --max-depth=1

    du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-de ...

  5. linux下限制一个文件夹大小的方法

    linux上有时由于一些特殊的用途,我们需要限制一个文件夹的大小.核心方法都是把需要限制的文件夹挂载在一个大小固定的分区上,下面有两种方法可以实现: 使用ramdisk linux可以把一部分内存mo ...

  6. Linux查看当前文件目录文件夹大小 (附:Linux文件文件夹大小查看全集)

    1.查看当前文件目录各个文件夹大小 du -h --max-depth=1 查看指定目录  du -h --max-depth=1 /path 2. 查看当前目录下所有目录及子目录大小 du -h - ...

  7. Linux系统查看各文件夹大小的命令du -lh命令

    du -lh --max-depth=1 查看各文件夹大小的命令. -l:-count-links重复计算硬件连接的文件. -h:-human-readable,以K,M,G为单位,提高信息可读性. ...

  8. linux如何查询一个文件夹大小,Linux下如何查看某个文件夹所占空间大小

    Linux下的du命令可以查看某个目录或者文件所占空间大小. 基础知识: 命令参数: -a或-all 显示目录中个别文件的大小. -b或-bytes 显示目录或文件大小时,以byte为单位. -c或- ...

  9. Linux dd 命令 限制文件夹大小

    先用dd命令建立一个5G大的文件,命名为dfs2: dd if=/dev/zero ibs=10M count=512 of=/dfs2 说明: if=/dev/zero:表示输入文件为/dev/ze ...

  10. linux查看文件夹大小,ls-l显示不正确

    在linux中经常使用ls-l 或者ls -lht查看文件大小,但是文件列表中有目录的时候就会发现显示的文件夹大小和实际文件大小不对应,文件夹的大小很多都是相等的,其实这是因为ls-l命令显示的是文件 ...

最新文章

  1. 用开放地址法中的线性探查法解决冲突实现哈希表的运算
  2. Log4j格式化符号
  3. C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态
  4. 【CyberSecurityLearning 68】python 编写exp
  5. linux进程管理笔记
  6. 线程的start()方法
  7. 怎样增强MyEclipse的代码自动提示功能
  8. 前端学习(481):html得编码问题
  9. lombok原理_听说学会用 Lombok 就可以让你早点下班?(你还不看)
  10. 2019春第八周作业
  11. android p preview_细数 Android P 开发者预览版中最不能错过的新特性
  12. mysql5.6.38占用内存过大问题解决
  13. Linux文件系统的正确挂载方式
  14. 实验四 使用CANVAS API画图
  15. 工作环境配置及putty工具常见设置
  16. 【随笔】诺贝尔奖提名探索
  17. 来了,来了,他来了,使用Github制作自己的在线简历(网页和PDF版)你都值得拥有
  18. Laravel下用户权限系统 的解决方案Zizaco/Entrust
  19. 电话号码归属地批量查询方法的优缺点对比
  20. CSS——制作三角形

热门文章

  1. 网络协议之:socket协议详解之Datagram Socket
  2. netty系列之:channelHandlerContext详解
  3. CentOS 6 安装Hadoop 2.6 (二)配置Hadoop
  4. Linux运行脚本忽略警告,ShellCheck - 显示Shell脚本的警告和建议的工具
  5. 安装Mongodb并解决用户授权问题
  6. Mining Precision Interface From Query Logs -- 学习笔记(二)
  7. 1034 Head of a Gang (30 分) One way that the police finds the head of a gang is to check people‘s pho
  8. 【已解决】FileNotFoundError: [Errno 2] No such file or directory:_Python系列学习笔记
  9. 【详细讲解】某书店有一个收银员该书店最多允许n个购书者进入。将收银员和购书者看作不同的进程,其工作流程如下图所示。利用PV操作实现该过程,设置信号量S1,S2和Sn,初值分别为0,0,n.则图中a1
  10. 解题报告——例题5-8 Unix is 命令(UVa 400)——26行代码解决