我想从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 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 上新创建的文件吗?
干杯,
马丁。
答案 0 :(得分:7)
gamin为许多* nix提供围绕系统相关文件通知apis的抽象,默认情况下它包含在许多Linux发行版中。
对于linux,您可以使用特定于Linux的inotify api。
Win32通过FindFirstChangeNotification
提供了类似的API答案 1 :(得分:2)
在Solaris 10外部连接dtrace命令或libdtrace(不推荐)时,可能没有更好的方法。在基于SunOS 5.11的操作系统(例如:OpenSolaris,Solaris 11 Express,...)上,您只需使用File Event Notification framework。
答案 2 :(得分:2)
解决方案是将最后访问时间存储在全局变量中,并选择带有scandir()
过滤器的最新文件:
int cmp_mtime( const struct dirent** lentry, const struct dirent** rentry )
:
(*lentry)->d_name
(由路径扩展,但这只是一个细节)ltime = statbuf.st_mtime;
(*rentry)->d_name
(由路径扩展,但这只是一个细节)rtime = statbuf.st_mtime;
if ( ltime < rtime ) return -1;
else if ( ltime > rtime ) return 1;
return 0;
int selector( const struct dirent* entry )
:
entry->d_name
(由路径扩展,但这只是一个细节)stat.st_mtime > lastseen
则返回1,否则返回0 主:
lastseen
scandir( directory, &entries, selector, cmp_mtime );
答案 3 :(得分:1)
在MacOS X上有一个file monitoring API,提供的示例代码显示了如何查找哪些文件已更改。
答案 4 :(得分:0)
一个技巧可能是设置处理文件的存档位。
伊迪丝说: 如果其他的回答没有其他问题,你可以使用chmod()代替。答案 5 :(得分:0)
答案 6 :(得分:0)
正在研究Solaris上的相同主题,并找到了要在脚本中使用的watchdir
应用程序的示例,如
watchdir /foo/bar
将执行阻塞等待,直到监视目录发生某些事情。
链接:https://solarisrants.wordpress.com/2013/07/24/solaris-file-event-notification/
答案 7 :(得分:0)
我知道你要求C提供解决方案,但实际上Java(现在)有一个跨平台类。您可以阅读更多相关信息here。另请参阅WatchService class的文档,它是Java文件更改通知功能的核心类。
也许在某些地方有一些关于Java如何在各种平台上实现这一点的文档?
从小处理解,Java在Linux,Solaris和Windows上使用操作系统的本机文件更改通知API,此外还实现了基于轮询的回退方法,该方法适用于任何平台。