如何让dirent忽略当前目录? 我在UBUTUU 16.04 Linux BR>上做C++程序,是从shell读取目录路径和组宽度。然后,它应该在目录中导航并跟踪文件,如果它找到了一个目录,那么就进入目录并跟踪这些文件。并在末尾打印直方图
我有一个奇怪的bug,由于我处理子文件夹的递归函数,它导致了一个看似无限的循环。如果我运行比较如何让dirent忽略当前目录? 我在UBUTUU 16.04 Linux BR>上做C++程序,是从shell读取目录路径和组宽度。然后,它应该在目录中导航并跟踪文件,如果它找到了一个目录,那么就进入目录并跟踪这些文件。并在末尾打印直方图,c++,file,ignore,C++,File,Ignore,我有一个奇怪的bug,由于我处理子文件夹的递归函数,它导致了一个看似无限的循环。如果我运行比较((J->d_type)==DT_DIR)其中struct dirent*J。读取所有文件后,它总是返回true,因为它会反复调用自己 有什么办法可以防止吗?我觉得我只需要一张额外的支票,但我不知道该检查什么。我通过结构链表实现了它。结构的代码如下: struct node{ node* next, *prev; int count, name, min, max; node()
((J->d_type)==DT_DIR)
其中struct dirent*J。读取所有文件后,它总是返回true,因为它会反复调用自己
有什么办法可以防止吗?我觉得我只需要一张额外的支票,但我不知道该检查什么。我通过结构链表实现了它。结构的代码如下:
struct node{
node* next, *prev;
int count, name, min, max;
node(){
prev = NULL;
next = NULL;
count = 0;
name = nodecount;
min = 0;
max = 0;
}
}
)
源代码如下:
int main(int argc,char *argv[]){
// Ensures that a valid directory is provided by the cmd line argument
if (argc != 3){
fprintf (stderr, "%d is not the valid directory name \n", argc);
return 1;
}
DIR * cwd; // current working directory pointer
struct dirent *J; // pointer to dirent struct
int binWidth; // variable for the width of the grouping in the histogram
binWidth = atoi(argv[2]);
node *first = new node;
nodecount++;
first->max = binWidth - 1;
node * current;
current = first;
bool isadirectory = false;
if((cwd = opendir(argv[1]))== NULL){
perror("Can't open directory");
return 2;
}
while ((J = readdir(cwd)) != NULL){
isadirectory = false;
if((J -> d_type) == DT_UNKNOWN ){
struct stat stbuf;
stat(J->d_name, &stbuf);
isadirectory = S_ISDIR(stbuf.st_mode);
}
else if((J -> d_type) == DT_DIR ){
isadirectory = true;
}
else{
if((J-> d_reclen <= current->max)&&(J->d_reclen >=current->min)){
current->count = current->count+1;
}
else if(J->d_reclen < current->min){
node*temp = current->prev;
while(temp->prev != NULL){
if((J-> d_reclen <= current->max)&&(J->d_reclen >=current->min)){
current->count = current->count+1;
break;
}
else if(J->d_reclen < current->min){
temp = current->prev;
}
}
}
else{
nodecount++;
current -> next = nextNode(current);
current = current -> next;
}
}
if(isadirectory){
traverseNewDirectory(current,J->d_name);
}
}
while ( ( closedir (cwd) == -1) && ( errno == EINTR) );
printHistogram(first);
return 0;
}
intmain(intargc,char*argv[]){
//确保cmd行参数提供有效的目录
如果(argc!=3){
fprintf(stderr,“%d不是有效的目录名\n”,argc);
返回1;
}
DIR*cwd;//当前工作目录指针
struct dirent*J;//指向dirent struct的指针
int binWidth;//直方图中分组宽度的变量
binWidth=atoi(argv[2]);
node*first=新节点;
nodecount++;
第一个->最大值=binWidth-1;
节点*电流;
电流=第一;
bool-isadirectory=false;
if((cwd=opendir(argv[1]))==NULL){
perror(“无法打开目录”);
返回2;
}
while((J=readdir(cwd))!=NULL){
isadirectory=false;
如果((J->d_类型)=DT_未知){
结构统计stbuf;
统计(J->d_名称和stbuf);
isadirectory=S_ISDIR(stbuf.st_模式);
}
如果((J->d_类型)==DT_DIR){
isadirectory=true;
}
否则{
如果((J->d\U重合闸最大值)和&(J->d\U重合闸>=当前->最小值)){
当前->计数=当前->计数+1;
}
否则如果(J->d_recen<当前->最小值){
节点*temp=current->prev;
while(临时->上一个!=NULL){
如果((J->d\U重合闸最大值)和&(J->d\U重合闸>=当前->最小值)){
当前->计数=当前->计数+1;
打破
}
否则如果(J->d_recen<当前->最小值){
温度=当前->上一个;
}
}
}
否则{
nodecount++;
当前->下一个=下一个节点(当前);
当前=当前->下一步;
}
}
如果(ISA目录){
traverseNewDirectory(当前,J->d_名称);
}
}
而((closedir(cwd)=-1)和&(errno==EINTR));
打印直方图(第一);
返回0;
}
检查strcmp(j->d_name,“.”==0,如果为true,则忽略目录
顺便说一下,非常不规范的名称,j
。检查strcmp(j->d_name,“.”==0,如果为真,则忽略目录
顺便说一句,
j
是一个非常不规范的名称。忽略strcmp(j->d_name,“…”)==0的情况可能也是一个好主意。你们都是对的。抱歉,没有说明的var名称。我的创造力在清晨逐渐衰退。我将在重构时考虑到这一点。忽略strcmp(j->d_name,“…”)==0的情况可能也是一个好主意。你们都是对的。抱歉,没有说明的var名称。我的创造力在清晨逐渐衰退。我将在重构时考虑到这一点。