如何在linux中以编程方式获取dir的大小?
我想通过 C 程序获取 linux 中特定目录的确切大小。 我尝试使用 statfs(path,struct statfs &) 但它没有给出确切的大小。 我也尝试过 stat() 但它返回任何目录的大小为 4096 !
请建议我如何获取 dir 的确切大小,就像我们在“du -sh dirPath”命令之后得到的那样。
我也不想通过 system() 使用 du。
提前致谢。
I want to get the exact size of a particular dir in linux through a C program.
I tried using statfs(path,struct statfs &) but it doesn't give exact size.
I also tried with stat() but it returns size as 4096 for any dir !
Please suggest me the way through which I can get the exact size of dir just like we get after "du -sh dirPath" command.
Also I dont wanna use du through system().
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
基于 Jim Plank 的 示例 帮助您入门:
注释、注意事项和读者问题:
这个答案是一个起点,而不是一个完整且强大的计算目录大小的程序。 如果您需要更多帮助,请阅读
du
程序的源代码。Based on Jim Plank's example to get you started:
Notes, considerations, and questions for the reader:
This answer is a starting point, not a complete and robust program to calculate directory sizes. If you need more help, read the source code for the
du
program.您需要 stat() 当前目录和子目录中的所有文件并将它们相加。
考虑为此使用递归算法。
You need to stat() all the files in the current directory and sub directories and add them up.
Consider using a recursive algorithm for this.
我想这个解决方案对于那些仍然可能遇到问题的人来说可能会有用。
这是为模仿 Linux
du
程序而编写的函数。 它递归地遍历所有目录并累加文件大小。注意,这个函数仍然不完整,因为它在硬链接上的行为不正确。 人们应该添加一个容器来存储指向同一 inode 实体的文件描述符,并使用它来消除同一文件的多个计数。
lstat()
用于处理符号链接(又名软链接),硬链接是这里的一个问题。I guess the solution may be useful for those who still may encounter the problem.
Here's the function that was written to imitate linux
du
program. It recursively goes through all directories and adds up file sizes.Note, that this function is still incomplete, since it behaves incorrectly on hard links. One should add a container to store file descriptors that point to the same inode entity and use that to get rid of multiple counts of the very same file.
lstat()
is used to handle symlinks (aka soft links), hard links is an issue here.如果您不想使用
'system'
,但可以使用'pipe'
、'fork'
、'execlp '
和'du'
,您可以构建一个管道,分叉一个新进程,重定向管道中子进程的'STDOUT'
,执行'du'
在子级中,并在父级中读取结果。 示例代码如下:If you do not want to use
'system'
, but are ok to use'pipe'
,'fork'
,'execlp'
and'du'
, you could build a pipe, fork a new process, redirect'STDOUT'
of the child in the pipe, exec'du'
in the child, and read the result in the parent. A sample code would be: