2011-05-06 72 views
2

我正在编写一个程序,该程序应该搜索用户提供的目录,以便查找在给定时间内一天内访问,修改或更改的所述目录中的所有文件。我有两个明确的问题,也许还有另一个问题。全球用户提供的目录?

第一个问题是我只能让程序做浅度搜索,它不会查看任何子目录。我确定它与我连接到目录缓冲区的内容有关(现在它是)。第二个问题是,它没有搜索每个文件,尽管它看起来大部分都是 - 我认为这可以回到问题1。第三个“问题”是,当我检查每个文件的访问时间时,似乎它们都是一样的(尽管我没有改变/修改时间的这个问题)。我通过VM在Ubuntu上运行,如果这可能影响访问时间。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <glob.h> 

/* Function that checks if specified file was accessed, modified, or 
changed within a day of the specified time.     */ 
void checkFile(long long time, char * fileName) { 
struct stat *s; 
time_t accessTime; 
time_t modTime; 
time_t changeTime; 
s = malloc(sizeof(struct stat)); 
if(stat(fileName,s) == 0) { 
    accessTime = s->st_atime; 
    modTime = s->st_mtime;  
    changeTime = s->st_ctime; 
    if((time - accessTime) <= 86400 && (time - accessTime) >= -86400) 
     printf("%s\n",fileName); 
    else if((time - modTime) <= 86400 && (time - modTime) >= -86400) 
     printf("%s\n",fileName); 
    else if((time - changeTime) <= 86400 && (time - changeTime) >= -86400) 
     printf("%s\n",fileName); 
} 
free(s); 
} 

void searchDirectory(long long time, glob_t globbuf) { 
if(globbuf.gl_pathc == 0) 
    printf("there were no matching files"); 
else { 
    int i; 
    for(i = 0; i < globbuf.gl_pathc; i++) 
     checkFile(time,globbuf.gl_pathv[i]); 
} 
} 

int main(int argc, char** argv) { 
    long long time = atol(argv[1]); 
    char * buf = argv[2]; 
    strcat(buf,"*.*"); 
    glob_t globbuf; 
    glob(buf, 0, NULL, &globbuf); 
    searchDirectory(time,globbuf); 
    globfree(&globbuf); 
    return 0; 
} 

谢谢你的时间!

回答

1

你不应该

cat(buf, "*.*"); 

...因为“BUF”是指向由操作系统提供的字符串 - 你不知道,如果缓冲区大到足以容纳多余的文字,你是加入。您可以分配一个大缓冲区,将argv[2]的内容复制到其中,然后附加"*.*",但要非常安全,您应该确定长度为argv[2],并确保缓冲区足够大。

您可以使用struct stat结构的st_mode成员来确定文件是否是目录(检查它是否等于S_IFDIR)。如果是,您可以将其设置为当前目录,并按照jonsca的建议,再次拨打searchDirectory函数。但是在使用递归时,通常需要确保对递归深度有限制,否则可能会溢出堆栈。这是一种“深度优先搜索”。我更喜欢的解决方案是使用队列进行“宽度优先搜索”:基本上将第一个glob推到列表的开头,然后重复从列表中删除第一个项目并搜索它,在该列表的末尾添加新目录列表中,直到列表为空。

在评估这类程序,老师喜欢对那些不吹他们的筹码很容易:)

附:获奖加分我猜测访问时间问题是一个虚拟机/文件系统/等不兼容,而不是你的错。

+0

非常感谢您提供这样丰富的答案! – 2011-05-07 06:34:06

相关问题