一尘不染

仅监视目录中的新文件

linux

我想在目录中监视来自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 上新创建的文件吗?


阅读 194

收藏
2020-06-07

共1个答案

一尘不染

解决方案是将最后访问时间存储在全局变量中,并使用过滤器选择最新文件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;

int selector( const struct dirent* entry )

  1. 统计信息entry->d_name(由路径扩展,但这仅是详细信息)
  2. 如果不是正常文件则返回0
  3. 如果stat.st_mtime > lastseen然后返回1,否则返回0

主要:

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