为了尝试在每个程序执行时创建一个新目录,我写了以下内容:
#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);
}
}
}
如果第一个目录名是new,则此方法有效;否则,如果S_ISDIR()
在第一次迭代时评估为true
,则在所有后续迭代中它将继续评估为true
,从而导致无限循环。尽管更改了checked-for目录名称,但这仍然存在。我错误地使用stat()
吗?
答案 0 :(得分:1)
是的,您正在使用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);
}