仅监视新文件的目录

时间:2010-11-04 14:02:53

标签: 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 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 上新创建的文件吗?

干杯,

马丁。

8 个答案:

答案 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 )

  1. 统计(*lentry)->d_name(由路径扩展,但这只是一个细节)
  2. ltime = statbuf.st_mtime;
  3. 统计(*rentry)->d_name(由路径扩展,但这只是一个细节)
  4. rtime = statbuf.st_mtime;
  5. if ( ltime < rtime ) return -1;
  6. else if ( ltime > rtime ) return 1;
  7. return 0;
  8. int selector( const struct dirent* entry )

    1. 统计entry->d_name(由路径扩展,但这只是一个细节)
    2. 如果不是普通文件,则返回0
    3. 如果stat.st_mtime > lastseen则返回1,否则返回0
    4. 主:

      1. 初始化全球时间变量lastseen
      2. scandir( directory, &entries, selector, cmp_mtime );
      3. 处理条目列表
      4. lastseen:=列表中最后一个条目的mtime

答案 3 :(得分:1)

在MacOS X上有一个file monitoring API,提供的示例代码显示了如何查找哪些文件已更改。

答案 4 :(得分:0)

一个技巧可能是设置处理文件的存档位。

伊迪丝说: 如果其他的回答没有其他问题,你可以使用chmod()代替。

答案 5 :(得分:0)

您可以使用FAM - File Alteration Monitor

答案 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,此外还实现了基于轮询的回退方法,该方法适用于任何平台。