http://lizzy115.blog.163.com/blog/static/36491958201010254255320/
在嵌入式linux系統中,經常要對一些即時資料進行儲存,而在儲存空間有限的情況下往往需要判斷儲存目錄中的檔案夾的大小,而通過C語言實現檔案夾大小的擷取在網上的程式可是少之又少,現提供一個程式,大家一起分享,分享,其實程式是提取檔案夾下所有檔案大小,提取運行程式檔案夾下的檔案的大小之和,但不包括檔案夾目錄下的檔案夾的大小。具體程式如下:
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
main()
{
DIR *d;
struct dirent *de;
struct stat buf;
int exists;
int total_size;
d = opendir(".");
if (d == NULL) {
perror("prsize");
exit(1);
}
total_size = 0;
for (de = readdir(d); de != NULL; de = readdir(d)) {
exists = stat(de->d_name, &buf);
if (exists < 0) {
fprintf(stderr, "Couldn't stat %s\n", de->d_name);
} else {
total_size += buf.st_size;
}
}
closedir(d);
printf("%d\n", total_size);
}
以下為另外一個檔案夾大小提取程式,程式內容:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
static unsigned int total = 0;
int sum(const char *fpath, const struct stat *sb, int typeflag)
{
total += sb->st_size;
return 0;
}
int main(int argc, char **argv)
{
if (!argv[1] || access(argv[1], R_OK)) {
return 1;
}
if (ftw(argv[1], &sum, 1)) {
perror("ftw");
return 2;
}
printf("%s: %u\n", argv[1], total);
return 0;
}
通過GCC編譯器
gcc -o dir_size dir_size.c
運行程式
./dir_size /licy/
下面的程式使用statfs函數實現硬碟大小資料提取,及剩餘空間大小的提取,並把硬碟大小及剩餘空間列印出來。
#include <stdio.h>;
#include <sys/vfs.h>;
#include <error.h>;
#define Gsize (1024.00*1024.00*1024.00)
#define Msize (1024.00*1024.00)
#ifndef EXT2_SUPER_MAGIC
#define EXT2_SUPER_MAGIC 0xef53
#endif
int main()
{
long long blocks,bfree;
struct statfs fs;
if(statfs("/",&fs)<0)
{
perror("statfs");
exit(0);
}
printf("%x\n",fs.f_type); /* type of filesystem (see below) */
printf("%ld\n",fs.f_bsize); /* optimal transfer block size */
printf("%ld\n",fs.f_blocks); /* total data blocks in file system */
printf("%ld\n",fs.f_bfree); /* free blocks in fs */
printf("%ld\n",fs.f_bavail); /* free blocks avail to non-superuser */
printf("%ld\n",fs.f_files); /* total file nodes in file system */
printf("%ld\n",fs.f_ffree); /* free file nodes in fs */
printf("%d\n",fs.f_fsid); /* file system id */
printf("%ld\n",fs.f_namelen); /* maximum length of filenames */
blocks=fs.f_blocks;
bfree=fs.f_bfree;
printf(" %lld\n",blocks);
if(fs.f_type==EXT2_SUPER_MAGIC)
{
printf("Total size of / is %f G\n",blocks*fs.f_bsize/Gsize);
printf("Free size of / is %f G\n",bfree*fs.f_bsize/Gsize);
}
}