stat()st_mode似乎没有更新

stat() st_mode appears not to update

本文关键字:更新 mode st stat      更新时间:2023-10-16

为了在每次程序执行时创建一个新目录,我写了以下内容:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <sstream>
int main(int argc, char *argv[]) {
  std::stringstream ss;
  std::string base = "directory";
  std::string dir;
  int dir_count = 0;
  bool isdir = true;
  while (isdir) {
    ss.str("");
    ss << base << dir_count << "/";
    dir_count++;
    dir = ss.str();
    struct stat mystat;
    stat(dir.c_str(), &mystat);
    if(! S_ISDIR(mystat.st_mode)) {
      isdir = false;
      mkdir(dir.c_str(), 0700);
    }
  }
}

如果第一个目录名是新的,则此操作有效;否则,如果S_ISDIR()在第一次迭代中评估为true,则它将在所有后续迭代中继续评估为true,从而导致无限循环。尽管更改了已检查的目录名。我是否错误地使用了stat()

是的,您使用stat不正确,因为您没有检查返回代码中的错误。如果你这样做了,你会发现stat将失败,因为一个还不存在的文件将无法通过stat的集合(ENOENT)。因此,在进行S_ISDIR检查之前,stat将失败。

你想要更多的东西:

    struct stat mystat;
    int ret = stat(dir.c_str(), &mystat);
    if (ret == -1)
        if (errno == ENOENT)
            if ((ret = mkdir(dir.c_str(), 0700)) != -1)
                isdir = false;
            else
            {
                perror("mkdir");
                exit(1);
            }
        else
        {
            perror("stat");
            exit(1);
        }