Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 仅监视新文件的目录_C_Linux_Monitoring_Solaris_Filesystems - Fatal编程技术网

C 仅监视新文件的目录

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

我想监视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上检测新创建的文件而不保留文件列表吗

干杯

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)

  • Stat
    (*lentry)->d_name
    (按路径扩展,但这只是一个细节)
  • ltime=statbuf.st\u mtime
  • Stat
    (*rentry)->d_name
    (按路径扩展,但这只是一个细节)
  • rtime=statbuf.st_mtime
  • if(ltime
  • else if(ltime>rtime)返回1
  • 返回0
  • int选择器(const struct dirent*entry)

  • Stat
    entry->d_name
    (按路径扩展,但这只是一个细节)
  • 如果不是普通文件,则返回0
  • 如果
    stat.st\u mtime>lastseen
    则返回1,否则返回0
  • 主要内容:

  • 初始全局时间变量
    lastseen
  • scandir(目录、条目和选择器、cmp\u mtime)
  • 处理条目列表
  • lastseen:=列表中最后一个条目的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()手册并考虑我上面写的,你应该能够得到信息。谢谢马丁。我会再检查一遍。