目录列表 C(使用 dirent 和 stat)
directory listing C (using dirent and stat)
我正在制作一个打印目录列表的应用程序
目录列表就像 Linux 和 Windows 中的“ls”和“dir”命令一样
我的函数:打印路径指定目录中所有文件的列表。
到目前为止,这是我的代码:
#include "ls.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
// Use this function to display the files. DO NOT CHANGE IT.
void _printLine(unsigned int size, unsigned int sizeOnDisk, const char* name)
{
printf("%010u %010u %s\n", size, sizeOnDisk, name);
}
// Assume this to be the maximum length of a file name returned by readdir
#define MAX_FILE_NAME_LENGTH 255
int list(const char* path)
{
(void) path;
struct dirent *dent;
struct stat s;
DIR *dir;
dir = opendir(".");
if (!dir){
perror("opendir");
return -1;
}
errno = 0;
while ((dent = readdir(dir)) != NULL){
_printLine(s.st_size, s.st_blocks*512, dent->d_name);
}
closedir(dir);
return 0;
}
我试图将文件的“大小”和“磁盘上的大小”传递给打印函数(使用 stat),同时还传递文件名(使用 dirent)。但是我不知道如何实现这个权利,或者它是否可能?
你从来没有打电话给 stat
?
$ gcc -Wall ls.c
$ ./a.out .
0000000160 0000000000 .
0000000608 0000000000 ..
0000000947 0000004096 ls.c
0000000811 0000004096 read.c
0000049840 0000053248 a.out
$ ls -l
total 120
-rwxr-xr-x 1 anicolao wheel 49840 Mar 18 08:39 a.out
-rw-r--r-- 1 anicolao wheel 947 Mar 18 08:39 ls.c
-rw-r--r-- 1 anicolao wheel 811 Mar 17 17:58 read.c
$ cat ls.c
//#include "ls.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
// Use this function to display the files. DO NOT CHANGE IT.
void _printLine(unsigned int size, unsigned int sizeOnDisk, const char* name)
{
printf("%010u %010u %s\n", size, sizeOnDisk, name);
}
// Assume this to be the maximum length of a file name returned by readdir
#define MAX_FILE_NAME_LENGTH 255
int list(const char* path)
{
(void) path;
struct dirent *dent;
struct stat s;
DIR *dir;
dir = opendir(".");
if (!dir){
perror("opendir");
return -1;
}
errno = 0;
while ((dent = readdir(dir)) != NULL){
stat(dent->d_name, &s);
_printLine(s.st_size, s.st_blocks*512, dent->d_name);
}
closedir(dir);
return 0;
}
int main(int argc, char **argv) {
return list(argv[1]);
}
还有缺少的错误检查,但我认为缺少的调用会让你继续。
我正在制作一个打印目录列表的应用程序 目录列表就像 Linux 和 Windows 中的“ls”和“dir”命令一样
我的函数:打印路径指定目录中所有文件的列表。
到目前为止,这是我的代码:
#include "ls.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
// Use this function to display the files. DO NOT CHANGE IT.
void _printLine(unsigned int size, unsigned int sizeOnDisk, const char* name)
{
printf("%010u %010u %s\n", size, sizeOnDisk, name);
}
// Assume this to be the maximum length of a file name returned by readdir
#define MAX_FILE_NAME_LENGTH 255
int list(const char* path)
{
(void) path;
struct dirent *dent;
struct stat s;
DIR *dir;
dir = opendir(".");
if (!dir){
perror("opendir");
return -1;
}
errno = 0;
while ((dent = readdir(dir)) != NULL){
_printLine(s.st_size, s.st_blocks*512, dent->d_name);
}
closedir(dir);
return 0;
}
我试图将文件的“大小”和“磁盘上的大小”传递给打印函数(使用 stat),同时还传递文件名(使用 dirent)。但是我不知道如何实现这个权利,或者它是否可能?
你从来没有打电话给 stat
?
$ gcc -Wall ls.c
$ ./a.out .
0000000160 0000000000 .
0000000608 0000000000 ..
0000000947 0000004096 ls.c
0000000811 0000004096 read.c
0000049840 0000053248 a.out
$ ls -l
total 120
-rwxr-xr-x 1 anicolao wheel 49840 Mar 18 08:39 a.out
-rw-r--r-- 1 anicolao wheel 947 Mar 18 08:39 ls.c
-rw-r--r-- 1 anicolao wheel 811 Mar 17 17:58 read.c
$ cat ls.c
//#include "ls.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
// Use this function to display the files. DO NOT CHANGE IT.
void _printLine(unsigned int size, unsigned int sizeOnDisk, const char* name)
{
printf("%010u %010u %s\n", size, sizeOnDisk, name);
}
// Assume this to be the maximum length of a file name returned by readdir
#define MAX_FILE_NAME_LENGTH 255
int list(const char* path)
{
(void) path;
struct dirent *dent;
struct stat s;
DIR *dir;
dir = opendir(".");
if (!dir){
perror("opendir");
return -1;
}
errno = 0;
while ((dent = readdir(dir)) != NULL){
stat(dent->d_name, &s);
_printLine(s.st_size, s.st_blocks*512, dent->d_name);
}
closedir(dir);
return 0;
}
int main(int argc, char **argv) {
return list(argv[1]);
}
还有缺少的错误检查,但我认为缺少的调用会让你继续。