c扫描新文件的文件夹

时间:2015-01-02 12:19:29

标签: c directory scanning

嘿,我必须编写一个扫描文件夹的程序(除非我们输入' q'),当找到新文件时,将其打印出来。我已经为上一次练习写了这个,它工作正常(只是扫描和打印文件夹中的所有文件)但不知道如何处理这个问题。

DIR *dp;
struct dirent *ep;     
dp = opendir (directory);
if (dp != NULL)
{
  while (ep = readdir (dp))
{
puts (ep->d_name);
}
(void) closedir (dp);
}
else
perror ("Couldn't open the directory"); return 1;

编辑:

好的,我已经这样了:

pthread_mutex_t mojmuteks=PTHREAD_MUTEX_INITIALIZER;

void *change(char *status)
{
   int x=1;
   while(x==1)
   {
      pthread_mutex_lock(&mojmuteks);
      *status=getchar();
      pthread_mutex_unlock(&mojmuteks);
   }
}


main(int argc, char *argv[])
{
DIR *dp;
struct dirent *ep; 
struct stat file_stat;
time_t last=0;
char status='n';
pthread_t mojwatek;

if (pthread_create( &mojwatek, NULL, change, &status) )
{
    printf("błąd przy tworzeniu wątku.");
    abort(); 
}
pthread_mutex_lock(&mojmuteks); 
while(status!='q')
{
    pthread_mutex_unlock(&mojmuteks);
    dp = opendir (argv[1]);
    last=file_stat.st_ctime;
     if (dp != NULL)
     {
        while (ep = readdir (dp))
        {
            stat(ep->d_name, &file_stat);
            if(last>file_stat.st_ctime)
            last=file_stat.st_ctime;
        }

    }
    else
    {
        perror ("Couldn't open the directory"); 
        return 1;
    }   
    (void) closedir (dp);  
    dp = opendir (argv[1]);
    if (dp != NULL)
      {
        while (ep = readdir (dp))
        {
                stat(ep->d_name, &file_stat);
                if(last<file_stat.st_ctime)
                puts (ep->d_name);
        }

      }
      else
      {
        perror ("Couldn't open the directory"); 
        return 1;
      }
      closedir(dp);  
     pthread_mutex_lock(&mojmuteks); 
}


return 0;
}

还有两个问题:使用互斥锁,&#34;主要&#34;每条路线等待响应后的过程&#34;更改&#34;只要我们没有输入&#39; q&#39;,如何修复它,而不仅仅是运行?第二个问题:我使用st_ctime检查哪个文件较旧,但有些文件在此变量中始终为0,为什么以及如何修复它?

2 个答案:

答案 0 :(得分:0)

您可以记下上次扫描的时间,并在您扫描的每个文件上使用fstat函数填充您传递的stat缓冲区,其中包含有关您传递句柄的文件的信息至。只需将上次扫描的时间与您可以获得的创建时间进行比较here。如果创建时间比上次扫描的时间短,则可以打印文件名。

请注意,如果没有文件句柄并且不想仅为此目的打开文件,则可以使用stat而不是fstat

答案 1 :(得分:0)

通常要监视文件系统的更改,您应该使用inotify(http://man7.org/linux/man-pages/man7/inotify.7.html)。 API有点复杂,所以我猜它不适合你的目的。

另请注意,您的目录扫描例程不会下载到子目录中(或处理各种链接,管道等)。除了简单地打印名称之外,您应该使用ftw(http://man7.org/linux/man-pages/man3/nftw.3.html