【问题标题】:stat() st_mode appears not to updatestat() st_mode 似乎没有更新
【发布时间】:2013-11-19 23:35:15
【问题描述】:

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

#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()

【问题讨论】:

    标签: c++ mkdir stat


    【解决方案1】:

    是的,您错误地使用了stat,因为您没有检查返回码是否有错误。如果您这样做了,您将看到stat 将失败,因为尚不存在的文件无法通过stat 的集合(ENOENT)。所以stat 在你进行 S_ISDIR 检查之前会失败。

    您想要更多类似的东西:

        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);
            }
    

    【讨论】:

    • 只要第一个文件不存在,我发布的程序就可以成功使用。 S_ISDIR 在这种情况下正确报告了一个不存在的文件夹。或许S_ISDIR的默认是false,所以真的只是巧合报错?
    • 因为 stat 失败,它永远不会填写 mystat。 S_ISDIR 正在对已经存在的任何垃圾值进行操作。无论该值是什么,它都不会评估为S_ISDIR,这就是您要测试的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2011-09-25
    相关资源
    最近更新 更多