2010-11-26 305 views
8

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

谢谢。

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)作为日志。为您的应用程序创建一个子目录,并且如果您喜欢另一个针对日志的子目录。 – 2010-11-27 19:29:32

回答

22

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

if (GetFileAttributes(newPath) == INVALID_FILE_ATTRIBUTES) { 
    CreateDirectory(newPath,NULL); 
} 

请注意,即使失败,函数将返回INVALID_FILE_ATTRIBUTES由于一些其他原因,如没有权限要访问该文件,所以您应该检查返回值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`。 – 2012-11-15 09:58:06

0

FindFirstFile。尽管名称中包含“File”,它仍能很好地找到目录。

1

我使用PathFileExists:如果该目录已经存在CreateDirectory将设置一个错误代码。

0

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

1

PathIsDirectory()怎么样?在原始示例中,您可以使用PathRemoveFilespec(),然后使用PathCombine()添加新的文件名/扩展名。如果您的目标只有Windows 8或更高版本,这种情况不太可能,但这些功能的安全性更高。

相关问题