所以我试着在C语言中编写一个类似Linux的ls命令的程序, 目前我已经能够列出当前工作目录中的文件和目录,但我似乎无法对不是我的CWD的目录做同样的事情,我是否需要更改它在我开始上市之前呢?或者函数opendir()是否适用于任何目录? 它必须像Linux中的ls -li一样工作,但我得到了处理的打印内容。 一般来说,我的程序看起来像这样(显然它有更多的东西):
void function(char *directory_to_list){
DIR *d;
struct dirent *dirp;
struct stat filestat;
if ( (d = opendir(directory_to_list)) == NULL){
//print error
}
while ( ( dirp = readdir(d) ) != NULL){
//here i call the stat() function for every entry to get various information
if (stat(dirp->d_name, &filestat) == -1){
continue;
}
//various prints
}
closedir(d);
}
编辑:命令是 - > ls -li [-dir]所以,如果你没有得到任何目录,你只需列出你的CWD。 p>
EDIT2:没有错误返回它只是什么也没做,它打开目录就好了,但是列出任何东西,所以我想stat调用没有做得好,还添加了我如何调用stat()的行。 / p>
答案 0 :(得分:1)
这是一个工作版本。请特别注意不要溢出缓冲区。你必须做一些重要的错误检查才能确保安全:
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
int function(char *);
int main(void)
{
function("/tmp");
return 0;
}
int function(char *path)
{
DIR *dir;
struct dirent *dentry;
struct stat filestat;
char *giantbuffer = malloc(sizeof(char) * ((PATH_MAX * 2 ) + 1) );
if ( ( dir = opendir(path) ) )
{
dentry = readdir(dir);
while ( dentry )
{
sprintf(giantbuffer, "%s/%s", path, dentry->d_name);
printf("%s ", giantbuffer);
if (stat(giantbuffer, &filestat) == 0)
printf("%zu\n", filestat.st_size);
dentry = readdir(dir);
}
closedir(dir);
}
else
return -1;
return 0;
}