如何监视文件系统路径名在 C 或 inotify 中被重命名?

问题描述

在这代码中,我正在监视一个文件一个目录。但是我有一个解决的问题,那就是,重命名哪个文件或目录的条件是什么?尽管 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);
}

解决方法

是的,这是可能的!

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

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

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