我正在编写一个程序,该程序应搜索用户提供的目录,以便查找所述目录中在给定时间内一天内访问,修改或更改的所有文件。我有两个明确的问题,也许还有另一个问题。
第一个问题是我只能让程序进行浅层搜索,它不会查看任何子目录。我确信它与我连接到目录缓冲区的内容有关(现在它是。)。第二个问题是它没有搜索每个文件,尽管它确实查看了大多数文件 - 我认为这可以追溯到第一个问题。第三个“问题”是,当我检查每个文件的访问时间时,似乎它们都是相同的(尽管我没有更改/修改时间的这个问题)。我正在通过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;
}
谢谢你的时间!
答案 0 :(得分:1)
你不应该
cat(buf, "*.*");
...因为'buf'是指向os提供的字符串的指针 - 你不知道该缓冲区是否足够大以容纳你正在添加的额外文本。您可以分配一个大缓冲区,将argv[2]
的内容复制到其中,然后附加"*.*"
,但为了确保您应该确定argv[2
的长度并确保缓冲区很大够了。
您可以使用st_mode
结构的struct stat
成员来确定该文件是否是目录(检查它是否等于S_IFDIR
)。如果是,您可以将其设为当前目录,并且如jonsca建议的那样,再次调用searchDirectory
函数。但是在使用递归时,您通常希望确保对递归深度有限制,或者可以溢出堆栈。这是一种“深度优先搜索”。我更喜欢的解决方案是使用队列进行“广度优先搜索”:基本上将第一个glob推送到列表的开头,然后重复从该列表中取出第一个项目并搜索它,在结尾处添加新目录。当你去的时候列出,直到列表为空。
在评估这样的节目时,教师喜欢为那些不会轻易放弃筹码的人奖励加分:)
P.S。我猜测访问时间问题是VM /文件系统/等不兼容而不是你的错。