linux系统下用c语言实现统计/tmp文件夹下每个文件夹得大小和每个文件得大小,并找出占内存最大的文件夹和文件,写出完整代码
时间: 2024-03-07 15:47:50 浏览: 96
以下是一个简单的C语言程序,可以实现统计/tmp文件夹下每个文件夹得大小和每个文件得大小,并找出占内存最大的文件夹和文件。其中,我们使用了Linux系统下的stat和dirent库函数来获取文件和目录的信息,使用了递归的方式来遍历文件夹。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#define MAX_PATH 1024
struct file_info {
char name[MAX_PATH];
off_t size;
};
struct dir_info {
char name[MAX_PATH];
off_t size;
};
void get_file_info(const char *path, struct file_info *info) {
struct stat st;
if (stat(path, &st) == 0) {
strncpy(info->name, path, MAX_PATH);
info->size = st.st_size;
} else {
perror("stat");
}
}
void get_dir_info(const char *path, struct dir_info *info) {
DIR* dir;
struct dirent* ent;
struct stat st;
off_t size = 0;
dir = opendir(path);
if (dir == NULL) {
perror("opendir");
return;
}
while ((ent = readdir(dir)) != NULL) {
char sub_path[MAX_PATH];
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) {
continue;
}
snprintf(sub_path, sizeof(sub_path), "%s/%s", path, ent->d_name);
if (lstat(sub_path, &st) == 0) {
if (S_ISDIR(st.st_mode)) {
struct dir_info sub_info;
get_dir_info(sub_path, &sub_info);
size += sub_info.size;
} else {
size += st.st_size;
}
}
}
strncpy(info->name, path, MAX_PATH);
info->size = size;
closedir(dir);
}
int cmp_file_info(const void *a, const void *b) {
const struct file_info *fa = (const struct file_info *)a;
const struct file_info *fb = (const struct file_info *)b;
if (fa->size < fb->size) {
return 1;
} else if (fa->size > fb->size) {
return -1;
} else {
return 0;
}
}
int cmp_dir_info(const void *a, const void *b) {
const struct dir_info *da = (const struct dir_info *)a;
const struct dir_info *db = (const struct dir_info *)b;
if (da->size < db->size) {
return 1;
} else if (da->size > db->size) {
return -1;
} else {
return 0;
}
}
int main(int argc, char *argv[]) {
struct file_info files[MAX_PATH];
struct dir_info dirs[MAX_PATH];
int num_files = 0, num_dirs = 0, i;
off_t total_size = 0;
DIR* dir;
struct dirent* ent;
struct stat st;
dir = opendir("/tmp");
if (dir == NULL) {
perror("opendir");
return 1;
}
while ((ent = readdir(dir)) != NULL) {
char path[MAX_PATH];
snprintf(path, sizeof(path), "/tmp/%s", ent->d_name);
if (lstat(path, &st) == 0) {
if (S_ISREG(st.st_mode)) {
struct file_info info;
get_file_info(path, &info);
files[num_files++] = info;
total_size += info.size;
} else if (S_ISDIR(st.st_mode)) {
struct dir_info info;
get_dir_info(path, &info);
dirs[num_dirs++] = info;
total_size += info.size;
}
}
}
qsort(files, num_files, sizeof(struct file_info), cmp_file_info);
qsort(dirs, num_dirs, sizeof(struct dir_info), cmp_dir_info);
printf("Total size: %ld bytes\n", total_size);
printf("Top 10 largest files:\n");
for (i = 0; i < 10 && i < num_files; i++) {
printf("%s: %ld bytes\n", files[i].name, files[i].size);
}
printf("Top 10 largest directories:\n");
for (i = 0; i < 10 && i < num_dirs; i++) {
printf("%s: %ld bytes\n", dirs[i].name, dirs[i].size);
}
closedir(dir);
return 0;
}
```
这个程序会输出/tmp文件夹下的总大小,以及占内存最大的前10个文件和文件夹的大小。程序中使用了两个结构体,分别用于保存文件和目录的信息。在获取文件和目录的大小时,我们使用了递归的方式,遍历了目录下的所有文件和子目录。最后使用了qsort函数对文件和目录的信息进行了排序,以方便我们找出占内存最大的文件和文件夹。
阅读全文