使用stat来检测文件是否存在(慢?)

我正在使用类似下面的代码来检查文件是否在继续之前已经被创build,事情是文件显示在文件浏览器之前很多被检测到stat …是否有这样做的问题?

//... do something struct stat buf; while(stat("myfile.txt", &buf)) sleep(1); //... do something else 

或者有更好的方法来检查文件是否存在?

“统计”系统调用正在收集有关文件的不同信息,例如,指向它的一些硬连接或其“inode”编号。 你可能想看看只能通过在“mode”中指定“F_OK”标志来执行存在检查的“访问”系统调用。

但是,你的代码有一点问题。 它会在每次检查尚不存在的文件时将进程休眠一秒钟。 为了避免这种情况,您必须使用Jerry Coffin建议的inotify API,以便在您等待的文件存在时通过内核获得通知。 请记住,如果文件已经存在,inotify不会通知您,所以实际上您需要同时使用“access”和“inotify”来避免在创建文件之后开始监视文件时的竞争状态。

没有更好或更快的方法来检查文件是否存在。 如果你的文件浏览器仍然显示文件稍微比这个程序检测到它快,那么Greg Hewgill关于重命名的想法可能正在发生。

下面是一个C ++代码示例,它设置了一个inotify监视器,检查文​​件是否已经存在,然后等待它:

 #include <cstdio> #include <cstring> #include <string> #include <unistd.h> #include <sys/inotify.h> int main () { const std::string directory = "/tmp"; const std::string filename = "test.txt"; const std::string fullpath = directory + "/" + filename; int fd = inotify_init (); int watch = inotify_add_watch (fd, directory.c_str (), IN_MODIFY | IN_CREATE | IN_MOVED_TO); if (access (fullpath.c_str (), F_OK) == 0) { printf ("File %s exists.\n", fullpath.c_str ()); return 0; } char buf [1024 * (sizeof (inotify_event) + 16)]; ssize_t length; bool isCreated = false; while (!isCreated) { length = read (fd, buf, sizeof (buf)); if (length < 0) break; inotify_event *event; for (size_t i = 0; i < static_cast<size_t> (length); i += sizeof (inotify_event) + event->len) { event = reinterpret_cast<inotify_event *> (&buf[i]); if (event->len > 0 && filename == event->name) { printf ("The file %s was created.\n", event->name); isCreated = true; break; } } } inotify_rm_watch (fd, watch); close (fd); } 

使用inotify ,您可以安排内核在发生文件系统更改(如文件创建)时通知您。 这很可能是您的文件浏览器用来快速了解文件的内容。

你的代码会检查文件是否每秒都在那里。 你可以使用inotify来获得一个事件。