C 仅监视新文件的目录
我想监视C应用程序中新文件的目录。但是,我对修改过的文件不感兴趣,只对新文件感兴趣。目前我正在使用readdir/stat来实现此目的:C 仅监视新文件的目录,c,linux,monitoring,solaris,filesystems,C,Linux,Monitoring,Solaris,Filesystems,我想监视C应用程序中新文件的目录。但是,我对修改过的文件不感兴趣,只对新文件感兴趣。目前我正在使用readdir/stat来实现此目的: while ( (ent = readdir(dir)) != NULL ) { strcpy(path, mon_dir); strcat(path, "/"); strcat(path, ent->d_name); if ( stat(path, &statbuf) == -1 ) { printf( "Can't s
while ( (ent = readdir(dir)) != NULL ) {
strcpy(path, mon_dir);
strcat(path, "/");
strcat(path, ent->d_name);
if ( stat(path, &statbuf) == -1 ) {
printf( "Can't stat %s\n", ent->d_name );
continue;
}
if ( S_ISREG(statbuf.st_mode) ) {
if ( statbuf.st_mtime > *timestamp ) {
tcomp = localtime( &statbuf.st_mtime );
strftime( s_date, sizeof(s_date), "%Y%m%d %H:%M:%S", tcomp );
printf( "%s %s was added\n", s_date, ent->d_name );
*timestamp = statbuf.st_mtime;
}
}
}
知道我如何在Linux和Solaris 10上检测新创建的文件而不保留文件列表吗
干杯
Martin。在MacOS X上有一个,提供的示例代码显示了如何查找已更改的文件。为许多*版本提供了一个关于依赖于系统的文件通知API的抽象,默认情况下,它包含在许多linux发行版中
对于linux,您可以使用linux特定的api
Win32通过具有类似的API一个技巧可能是为已处理的文件设置存档位 伊迪丝说:
如果其他回答没有其他帮助,您可以使用chmod()来代替。您可以使用它。除了与dtrace命令或libdtrace(不推荐)进行接口外,可能没有更好的方法使用Solaris 10。在基于SunOS 5.11的操作系统(例如:OpenSolaris、Solaris 11 Express等)上,您只需使用。解决方案是将上次访问时间存储在全局变量中,并使用过滤器选择最新的文件,以
scandir()
:
int-cmp\u-mtime(const-struct-dirent**lentry,const-struct-dirent**rentry)
:
(*lentry)->d_name
(按路径扩展,但这只是一个细节)ltime=statbuf.st\u mtime代码>
(*rentry)->d_name
(按路径扩展,但这只是一个细节)rtime=statbuf.st_mtime代码>
if(ltime
else if(ltime>rtime)返回1代码>
返回0代码>
int选择器(const struct dirent*entry)
:
entry->d_name
(按路径扩展,但这只是一个细节)stat.st\u mtime>lastseen
则返回1,否则返回0lastseen
scandir(目录、条目和选择器、cmp\u mtime)代码>
正在Solaris上研究同一主题,并发现了
watchdir
应用程序的示例,可在脚本中使用,如中所示
watchdir /foo/bar
它将执行阻塞等待,直到监视的目录上发生某种情况
链接:我知道您要求从C获得解决方案,但事实上Java(现在)有一个跨平台的类。你可以阅读更多关于它的内容。另请参阅文档,它是Java文件更改通知功能的中心类 也许有一些关于Java如何在各种平台上实现这一点的文档
据我所知,Java在Linux、Solaris和Windows上使用操作系统的本机文件更改通知API,此外还实现了一种基于轮询的回退方法,该方法可以在任何平台上运行 C#具有用于更改目录状态的事件处理程序。也就是说,如果新文件在目录中创建。这可能依赖于某种Win API,该API可能是使用C开发的。此评论不是确切的答案,但我预计可能存在与操作系统相关的内容。请告诉我您计划部署什么平台。因为您在评论中说您的目标是Linux和Solaris,我冒昧地添加了这两个标签。@JeremyP:谢谢。我现在也更新了这个问题。gamin是否作为Solaris 10软件包提供?如果是的话,我可以考虑。好主意(1)。但是,我的目标是没有归档位的Solaris/Linux,我没有提到我只针对Linux/Solaris。但是无论如何谢谢你的链接。你能给我提供完整的实现吗?对不起,我身上没有那个代码。它属于我以前的公司。但是如果你查看SCAN()手册并考虑我上面写的,你应该能够得到信息。谢谢马丁。我会再检查一遍。