【问题标题】:How to monitor that the filesystem pathname is renamed in C or inotify?如何监控文件系统路径名在 C 或 inotify 中重命名?
【发布时间】:2021-05-29 17:12:45
【问题描述】:

在这段代码中,我正在监视一个文件和一个目录。但是我有一个我想解决的问题,那就是要重命名哪个文件或目录的条件是什么?尽管IN_MODIFY 仅在修改文件文本时才适用于该文件。但我想监控文件或目录是否被重命名

是否可以使用inotifyC

int main(){
  int length, i = 0, fd, wd;
  char buffer[EVENT_BUF_LEN];

  fd = inotify_init();
  if (fd < 0){
      perror( "inotify_init" );
  }
  wd = inotify_add_watch(fd, pathname1, IN_MODIFY);
  length = read( fd, buffer, EVENT_BUF_LEN); 
  if(length < 0){
      perror("read");
  }  

  while(i < length){     
    struct inotify_event *event = ( struct inotify_event *)&buffer[i];
      if(event->len){
          if(event->mask & IN_MODIFY){
              if(event->mask & IN_ISDIR){
                if(event->wd == wd){
                  // if directory name changed. I don't know what condition to put
                  printf("The directory name '%s' is changed with %s\n", event->name);
                }
              }
              else{
                if(event->wd == wd){
                  // if file name changed. I don't know what condition to put
                  printf("The file name '%s' is changed with %s\n", event->name);
                }
              }
          }
      }
      i += EVENT_SIZE + event->len;
  }
    inotify_rm_watch(fd, wd);
  close(fd);
}

【问题讨论】:

    标签: c linux inotify


    【解决方案1】:

    是的,这是可能的!

    在 Unix 中,文件重命名与文件移动相同。您只是将文件从一个名称“移动”到同一目录中的新名称。

    您可以使用IN_MOVE_SELF 事件来检测您正在观看的文件或目录是否被移动。

    但是,我不确定这是否会检测到文件的路径是否会因为其父目录之一被移动或重命名而发生更改。如果您也想检查这一点,则必须注意每个父目录上的事件。当目录中包含的文件被移动或重命名时,目录会收到事件IN_MOVED_FROMIN_MOVED_TO。重命名将显示为 IN_MOVED_FROM 事件,然后是具有相同 cookie 值的 IN_MOVED_TO 事件,因此您可以将它们关联起来。

    【讨论】:

    • 我不知道 inotify 或其他什么,但我很确定这可以通过检查 fopen(...) 是否在已知存在的文件上返回 NULL 来更简单?我错了吗 ?不久前,当 OP 提出这个问题时,我提出了这个建议(这是重复的
    • 这会告诉你文件现在是否存在,但如果你想知道它是否会在未来某个时候消失,你必须继续致电fopen
    • 好的,Willis,但是可以做到这一点,对吗?此外,在errno 的帮助下,可以查明为什么文件也无法打开?
    • @MarcoBonelli 阅读我最初的评论会回答这个问题。我很好奇是否可以在 fopen()errno 检查的帮助下轻松完成相同的操作(作为可移植代码的傻瓜)。就这样。此外,OP 在这里和最后一个问题中提出了“是否可以使用 inotify 或使用 C?
    • @MarcoBonelli 我请求你再读一遍。 OP 说“是否有可能使用 inotify 或使用 C?” + 我从未声称要解决 OP 的问题,只是在inotify上向知识渊博的人提出了一个问题>
    猜你喜欢
    • 2017-04-10
    • 2021-05-29
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多