如何读取命令行中给出的目录并打开并打印目录

时间:2016-05-19 05:56:52

标签: c linux

我正在开发一个图形ls版本,用树表示ls的输出。我已经完成了大部分代码,但希望能够在命令行中确定要读取的目录。我尝试过使用

ko.validation.init({
    grouping: {
        deep: true,
        live: true,
        observable: true
    }
});

ko.validation.rules['foo'] = {
    validator: function(arr) {
        if (!arr.length) {
            return false;
        } else {
            return true;
        }
    },
    message: 'Please foo.'
};
var a = ko.observableArray().extend({ foo: true });
var avm = ko.validatedObservable({
    a: a
});
var aerr = ko.validation.group([a]);

var b = ko.observableArray().extend({ required: true });
var bvm = ko.validatedObservable({
    b: b
});
var berr = ko.validation.group([b]);    

但这不起作用,导致打开文件时出错,以及文件大小和其他信息没有更新。

任何信息都将不胜感激!感谢。

DIR *d
d = opendir(argv[1]);

2 个答案:

答案 0 :(得分:1)

你在while循环之前读取stat,这在你的情况下是dir。 然后对于目录中的每个文件,您正在检查st_mode,但是在while循环中没有更新。

答案 1 :(得分:0)

 if (stat(argv[(argc - 1)], &statBuf) < 0)

此行只查询目录信息,因此您将始终获得目录类型。 你应该查询该目录下的特定文件, 所以你可以改变这样的代码:

#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>

#include <errno.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>

/* Resource: http://stackoverflow.com/questions/4204666/how-to-list-files-in-a-directory-in-a-c-program */

/* Resource: http://cboard.cprogramming.com/linux-programming/131-stat.html */
#define MAX_FILE_NAME_LEN 256

int main(int argc, char *argv[])
{
  char path[MAX_FILE_NAME_LEN] = {0};
  struct stat statBuf;

  if (argc != 2) {
    printf("Usage: './gls <directory_name>'\n");
    exit(0);
  }


  if (stat(argv[(argc - 1)], &statBuf) < 0) {
    printf("Error: No such file exists.\n");
    exit(0);
  }

  DIR           *d;
  struct dirent *dir;
  //char currentPath[FILENAME_MAX];

  d = opendir(argv[1]);


  while ((dir = readdir(d)) != NULL) {

    //getcwd(currentPath, FILENAME_MAX);
    //strcat(currentPath, "/");
    //strcat(currentPath, dir->d_name);
    //if(stat(currentPath, &statBuf) == -1){
      //printf("N")
    //}
   memset(path, 0, MAX_FILE_NAME_LEN);
   snprintf(path,MAX_FILE_NAME_LEN,"%s%s",argv[1],dir->d_name);
    //getcwd(currentPath, FILENAME_MAX);

   if (stat(path, &statBuf) < 0) {
     printf("Error: No such file exists.\n");
     continue;
     // exit(0);
   }                                                                                    

    if(S_ISREG(statBuf.st_mode)) {

      printf("| %s (regular file - %d - !checksum!)\n", dir->d_name, (int)statBuf.st_size);             /* If regular file */
    }

    if(S_ISDIR(statBuf.st_mode)) {
      printf("| %s (directory - size)\n", dir->d_name);
    }

    if(S_ISLNK(statBuf.st_mode)) {
      printf("| %s (symbolic link - points to !!!\n", dir->d_name);
    }

    if(S_ISFIFO(statBuf.st_mode)) {
      printf("| %s (fifo (named pipe))\n", dir->d_name);
    }
  }

  closedir(d);

  return(0);
}