嘿,我必须编写一个扫描文件夹的程序(除非我们输入' 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,为什么以及如何修复它?
答案 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)