ProgrammingThis forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
In C++, what is the best way to find the total storage allocated in a directory? I am familiar with stat and statfs which returns allocations of a file and total disk, respectively, but how to you get the allocated space of the contents of a directory?
struct stat st;
stat( szPath, &st );
long lBytes = st.st_blocks * st.st_blksize;
...
This gives an answer 8 X too large. While st.st_blksize is 4096,
the actual block size is 512 (as derives from the size shown by
the file File Manager.
Why are you calculating by blocks? Does st.st_size not contain the right filesize, or do you want to count the total size taken up on the disk?
Apparently st_blksize is the 'preferred blocksize' for talking to the device but st_blocks is always measured in 512-byte blocks, so just do st_blocks << 9.
No, I meant << 9, as that multiplies by 2^9, or 512. << 3 only multiplies by 8 (which is fine if you want to know how big your file is in terms of 64-byte blocks)
Distribution: Solaris 11.4, Oracle Linux, Mint, Debian/WSL
Posts: 9,789
Rep:
Beware that either methods can be innacurate.
Summing file size can lead to very different results than the real size the directory is using on the disk:
Files smaller that the allocation unit would lead you to think less space is used that the real one.
Sparse files will make you think the opposite (puzzle people by creating a 2 Gb file on a 1Gb partition).
Finally, pay attention not to count multiple times files sharing the same inode (hard-links).
Good points jlliagre, I forgot about sparse files. Of course, if he only wants the physical disk space used, then this method won't cause him trouble...
If you check the st_nlink member to make sure it's 1, you won't have a hardlink issue (if it is >1, add st_ino to an array, and check any future files with nlink > 1 against this array, that should be enough to avoid hard link issues. Also, you may want to use lstat instead of stat to correctly count space used by symbolic links).
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.