你如何检查目录是否存在于Windows上的C?

在Windows C应用程序中,我想validation传递给函数的参数,以确保指定的path存在。*

你如何检查目录是否存在于Windows上的C?

*我知道你可以进入竞争状态,在你检查存在的时间和你使用的path不再存在的时间之间,但我可以处理。

额外的背景

明确知道某个目录是否存在可能会在权限进入时变得棘手。 有可能在尝试确定目录是否存在时,该进程没有访问目录或父目录的权限。 这对我的需求是可以的 。 如果目录不存在或者我无法访问它们,那么在我的应用程序中都将被视为无效的path故障,所以我不需要区分。 (虚拟)奖励积分,如果您的解决scheme提供了这种区别。

C语言,C运行时库或Win32 API的任何解决scheme都很好,但理想情况下,我想坚持通常加载的库(例如kernel32,user32等),并避免涉及加载非标准库的解决scheme(如Shlwapi.dll中的PathFileExists )。 如果您的解决scheme是跨平台的话,(虚拟)奖励点也是如此。

有关

我们如何检查一个文件是否存在或不使用Win32程序?

做这样的事情:

BOOL DirectoryExists(LPCTSTR szPath) { DWORD dwAttrib = GetFileAttributes(szPath); return (dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); } 

Kernel32.dll中包含GetFileAttributes ()方法。

这是一个完全平台不可知的解决scheme(使用标准的C库)

编辑:为了在Linux中编译,用<unistd.h>_accessreplace<io.h>access 。 对于一个真正的平台不可知的解决scheme,使用Boost FileSystem库。

 #include <io.h> // For access(). #include <sys/types.h> // For stat(). #include <sys/stat.h> // For stat(). bool DirectoryExists( const char* absolutePath ){ if( _access( absolutePath, 0 ) == 0 ){ struct stat status; stat( absolutePath, &status ); return (status.st_mode & S_IFDIR) != 0; } return false; } 

支持MBCS和UNICODE构build的Windows特定实现:

 #include <io.h> #include <sys/types.h> #include <sys/stat.h> #include <tchar.h> BOOL directory_exists( LPCTSTR absolutePath ) { if( _taccess_s( absolutePath, 0 ) == 0 ) { struct _stat status; _tstat( absolutePath, &status ); return (status.st_mode & S_IFDIR) != 0; } return FALSE; } 

如果链接到Shell Lightweight API(shlwapi.dll)对您来说可以,您可以使用PathIsDirectory函数 。

另一个选项是shell函数PathFileExists()

PathFileExists()文档

此函数“确定文件系统对象(如文件或目录)的path是否有效。