使用用户提供的目录的Glob?

时间:2011-05-06 03:16:10

标签: c glob

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

第一个问题是我只能让程序进行浅层搜索,它不会查看任何子目录。我确信它与我连接到目录缓冲区的内容有关(现在它是)。第二个问题是它没有搜索每个文件,尽管它确实查看了大多数文件 - 我认为这可以追溯到第一个问题。第三个“问题”是,当我检查每个文件的访问时间时,似乎它们都是相同的(尽管我没有更改/修改时间的这个问题)。我正在通过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 个答案:

答案 0 :(得分:1)

你不应该

cat(buf, "*.*");

...因为'buf'是指向os提供的字符串的指针 - 你不知道该缓冲区是否足够大以容纳你正在添加的额外文本。您可以分配一个大缓冲区,将argv[2]的内容复制到其中,然后附加"*.*",但为了确保您应该确定argv[2的长度并确保缓冲区很大够了。

您可以使用st_mode结构的struct stat成员来确定该文件是否是目录(检查它是否等于S_IFDIR)。如果是,您可以将其设为当前目录,并且如jonsca建议的那样,再次调用searchDirectory函数。但是在使用递归时,您通常希望确保对递归深度有限制,或者可以溢出堆栈。这是一种“深度优先搜索”。我更喜欢的解决方案是使用队列进行“广度优先搜索”:基本上将第一个glob推送到列表的开头,然后重复从该列表中取出第一个项目并搜索它,在结尾处添加新目录。当你去的时候列出,直到列表为空。

在评估这样的节目时,教师喜欢为那些不会轻易放弃筹码的人奖励加分:)

P.S。我猜测访问时间问题是VM /文件系统/等不兼容而不是你的错。