如何检查Windows中C中是否存在目录?


74

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

如何检查Windows中C中是否存在目录?

*我了解您可以进入比赛条件,在检查存在的时间到使用不再存在的路径之间的时间,但是我可以解决。

其他背景

当权限起作用时,明确知道目录是否存在可能会变得很棘手。在尝试确定目录是否存在时,该进程可能没有访问目录或父目录的权限。这可以满足我的需求。如果该目录不存在或我无法访问它,则两者在我的应用程序中均被视为无效路径失败,因此无需区分。(虚拟)奖励积分(如果您的解决方案提供了这种区别)。

使用C语言,C运行时库或Win32 API的任何解决方案都可以,但是理想情况下,我想坚持使用通常加载的库(例如kernel32,user32等),避免使用涉及加载非标准库的解决方案(例如Shlwapi.dll中的PathFileExists)。同样,如果您的解决方案是跨平台的,则(虚拟)奖励积分。

有关

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


1
“我无法访问”是什么意思?读取权限?写访问权限?删除文件访问权限?
Jim Mischel

好问题。为此,请阅读访问权限。我会假设(读:这可能很愚蠢)检查读访问就足够了,然后尝试在该目录中执行任何文件访问(RWD)将导致该API调用(例如CreateFile,WriteFile)的相应失败。但是,如果您甚至无法访问目录进行读取(因为目录不存在或您没有权限),那么在调用文件访问功能时使用目录将导致失败,无法与路径问题区分开。
扎克·伯林格姆

在Windows API中,我认为您也可以使用FindFirstFile()来测试是否存在。msdn.microsoft.com/en-us/library/windows/desktop/...
Indinfer

正如上一段所建议的,“普通加载”和“非标准”库不是互斥的。
Adrian McCarthy

Answers:


99

做这样的事情:

GetFileAttributes()方法被包括在Kernel32.dll中。


3
如果szPath为"C:\\",则GetFileAttributes,PathIsDirectory和PathFileExists将不起作用。
zwcloud 2015年

我刚刚发现GetFileAttributes()无法看到某些虚拟COM端口,否则这些端口可完美用于CreateFile()。尽管头文件中存在FILE_ATTRIBUTE_DEVICE。哼
frr

@zwcloud您在哪里测试了?GetFileAttributes对我来说工作正常。
马丁

24

这是一个完全与平台无关的解决方案(使用标准C库)

编辑:对于这个在Linux中编译,替换<io.h><unistd.h>_accessaccess。对于真正的平台不可知的解决方案,请使用Boost FileSystem库。

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


5
这与平台无关,也不是标准的,不是微软对POSIX的模仿(实际上您会从中得到access<unistd.h>而且不会以下划线开头。)
asveikau

糟糕,我的糟糕。没错,如果我寻找#include的.h,它们在Visual Studio文件夹中。一件事:当您说“模仿”时,您是说它实际上不符合POSIX吗?就像...在Linux上无法编译?
dario_ramos 2011年

2
正确,它不是POSIX,在其他平台上不存在io.h_access(带有下划线)。
asveikau 2011年

1
即使所有人都认为Win32接受/而不是``无处不在。我对此感到困惑,但是看起来,在Win32上使用POSIX路径和POSIX libc函数要小心。
mxcl

是的,就像asveikau所说的那样,Windows的POSIX实现并不完美。如果您希望可移植文件系统访问,请使用Boost(这就是我现在正在做的)。
dario_ramos 2013年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.