如何在MFC(VC++)中检查目录是否已存在?

10

如何在MFC(VC++)中检查目录是否已经存在? 我正在使用以下代码获取当前应用程序路径并创建NDSLog文件夹,以便将所有日志文件放置在那里,现在我想检查条件,如果NDSLog文件夹已经存在,则不要创建它。如何实现?

谢谢。

char strPathName[_MAX_PATH];
    ::GetModuleFileName(NULL, strPathName, _MAX_PATH);

    // The following code will allow you to get the path.
    CString newPath(strPathName);
    int fpos = newPath.ReverseFind('\\');

    if (fpos != -1)
    newPath = newPath.Left(fpos+1);     
    newPath += "NDSLog\\" ;

    CreateDirectory(newPath,NULL); 

5
我可以插一句,请求您不要把日志放在当前目录下吗?在Vista和Windows 7上,非管理员权限(换句话说就是普通权限)的应用程序无法在Program Files目录下写入。既然您正在编写这段代码,并且是为Windows编写的,请使用AppData(CSIDL_APPDATA)作为日志存储位置。为您的应用程序创建一个子目录,如果您愿意,再在该目录下创建另一个用于日志的子目录。 - Kate Gregory
6个回答

26

检查文件/目录是否存在的最简单方法是使用GetFileAttributes

if (GetFileAttributes(newPath) == INVALID_FILE_ATTRIBUTES) {
  CreateDirectory(newPath,NULL);
}
请注意,即使由于某些其他原因(例如无权访问文件),该函数失败也会返回“INVALID_FILE_ATTRIBUTES”,因此您应该检查CreateDirectory的返回值以确保它成功了。实际上,您不需要检查目录是否已经存在;如果目录已经存在,CreateDirectory将设置一个错误代码:
if (!CreateDirectory(newPath,NULL)) {
  if (GetLastError() == ERROR_ALREADY_EXISTS) {
    // directory already exists
  } else {
    // creation failed due to some other reason
  }
}

1
两种解决方案都没有考虑到可能存在与要创建的目录同名的(常规)文件:第一种方法(GetFileAttributes())应该添加一个检查,以防返回值!= INVALID_FILE_ATTRIBUTES时设置了“目录”属性。然后目录已经存在。否则,同名的常规文件将阻止目录被创建。对于第二种方法也是如此:如果已经存在一个常规文件(而不是目录),则CreateDirectory()会返回ERROR_ALREADY_EXISTS - oli_arborum

3

PathIsDirectory()怎么样?在原始示例中,您可以使用PathRemoveFilespec()后跟PathCombine()添加新的文件名和扩展名。如果您只针对Windows 8或更高版本,则有更安全的这些函数的PathCch...()版本。


1

我使用 PathFileExists。


0

我必须指出,当文件是网络路径时,GetFileAttributes 的工作速度较慢。 实际上,第一次速度很慢,之后就很快。


0

FindFirstFile。尽管名称中有“文件”,但它也可以很好地查找目录。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接