为该函数添加一个功能,不仅返回文件名称,还要返回各个文件的大小
时间: 2024-03-13 17:44:49 浏览: 158
好的,可以通过结合 `stat` 函数获取文件的大小,并将其添加到返回给客户端的字符串中。下面是修改后的代码:
```c
void list_dir(int sockfd) {
char buffer[BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
DIR *dir;
struct dirent *entry;
struct stat file_stat;
if ((dir = opendir(".")) == NULL) {
sprintf(buffer, "无法打开目录\n");
if (send(sockfd, buffer, strlen(buffer), 0) < 0) {
perror("send error");
exit(EXIT_FAILURE);
}
return;
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_name[0] != '.') {
char size_str[20];
if (stat(entry->d_name, &file_stat) == -1) {
sprintf(size_str, "未知大小");
} else {
sprintf(size_str, "%ld bytes", file_stat.st_size);
}
sprintf(buffer + strlen(buffer), "%-20s %s\n", entry->d_name, size_str);
}
}
if (send(sockfd, buffer, strlen(buffer), 0) < 0) {
perror("send error");
exit(EXIT_FAILURE);
}
}
```
这里添加了一个 `struct stat` 类型的变量 `file_stat`,用于保存 `stat` 函数返回的文件信息。在循环遍历目录项的过程中,先调用 `stat` 函数获取当前目录项的大小,如果 `stat` 函数返回 -1,则说明获取大小失败,给其赋值为 "未知大小",否则将其转换为字符串格式并保存到 `size_str` 数组中。然后使用 `sprintf` 函数将文件名和大小拼接成一个字符串,并把它添加到 `buffer` 数组中。最后将 `buffer` 数组中的字符串发送给客户端。
阅读全文