我正在开发一个图形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]);
答案 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);
}