【问题标题】:How to check if Directory already Exists in MFC(VC++)?如何检查目录是否已存在于 MFC(VC++) 中?
【发布时间】:2011-05-16 00:27:43
【问题描述】:

如何检查目录是否已经存在于 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); 

【问题讨论】:

  • 我可以插入请求不要将您的日志放在当前目录下吗?在 Vista 和 Windows 7 上,非提升(换句话说,普通)应用程序无法在 Program Files 下的任何位置写入。由于您今天正在编写此代码,并且您正在为 Windows 编写代码,因此请使用 AppData (CSIDL_APPDATA) 作为您的日志。为您的应用创建一个子目录,如果您喜欢另一个用于日志的子目录。

标签: visual-c++ mfc


【解决方案1】:

检查文件/目录是否存在的最简单方法是使用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
  }
}

【讨论】:

  • 两种解决方案都考虑到,可能存在与要创建的目录同名的(常规)文件:第一种方法 (GetFileAttributes())如果返回值 != INVALID_FILE_ATTRIBUTES,则应添加检查是否设置了“目录”属性。然后该目录确实已经存在。否则,具有相同名称的常规文件将阻止创建目录。第二种方法相同:如果常规文件(不是目录)已经存在,CreateDirectory() 返回ERROR_ALREADY_EXISTS
【解决方案2】:

PathIsDirectory() 怎么样?在原始示例中,您可以使用PathRemoveFilespec() 后跟PathCombine() 添加新的文件名/扩展名。万一您的目标只是 Windows 8 或更高版本,这些函数有更安全的PathCch...() 风格。

【讨论】:

    【解决方案3】:

    我使用 PathFileExists。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您可以在 C 运行时使用 _accees 或 _waccess。 This is the msdn page and you can see sample usage 而且您不必担心目录是否已经存在,因为 CreateDirectory 检查并返回 ERROR_ALREADY_EXISTS 如果存在。 You can see from here (Return Codes).

        【讨论】:

          【解决方案6】:

          我必须注意,当文件是网络路径时,GetFileAttributes 工作缓慢。 实际上,它第一次运行很慢,然后运行很快。

          【讨论】:

            猜你喜欢
            • 2022-08-21
            • 2010-11-23
            • 2014-12-18
            • 2012-09-12
            • 2010-11-08
            • 1970-01-01
            • 2023-03-14
            相关资源
            最近更新 更多