C打开和阅读目录

时间:2015-10-07 00:53:08

标签: c linux directory ls

所以我试着在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。

EDIT2:没有错误返回它只是什么也没做,它打开目录就好了,但是列出任何东西,所以我想stat调用没有做得好,还添加了我如何调用stat()的行。 / p>

1 个答案:

答案 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;
}