C 如何确定文件是否为目录(最佳方式)

C 如何确定文件是否为目录(最佳方式),c,winapi,C,Winapi,我在一个独立于操作系统的文件管理器中工作,在正确检测文件是否是Windows上的目录时遇到问题。 windows上的dirent结构似乎没有DT_DIR字段,因此我使用: file_attributes=GetFileAttributes(ep->d_name); if(file_attributes & FILE_ATTRIBUTE_DIRECTORY)files_list[i].is_dir=1; else files_list[i].is_dir=0; 但是,这并不总是准确

我在一个独立于操作系统的文件管理器中工作,在正确检测文件是否是Windows上的目录时遇到问题。 windows上的
dirent
结构似乎没有
DT_DIR
字段,因此我使用:

file_attributes=GetFileAttributes(ep->d_name);
if(file_attributes & FILE_ATTRIBUTE_DIRECTORY)files_list[i].is_dir=1;
else files_list[i].is_dir=0;
但是,这并不总是准确的,因为有些文件被标记为目录(例如,pagefile.sys)。此外,如果文件太多,
GetFileAttributes
相当慢

我还有一个功能:

int does_dir_exist(char *path)
{
DIR *dp_test;

dp_test = opendir(path);
if(dp_test)
    {
        return 1;
        closedir(dp_test);
    }

return 0;
  }
但这相当慢(在10000个文件上这样做不是一个好主意)

当然,我可以很快地将两者结合起来,但是有更好的方法吗

由于某些原因,p.S.无法正确格式化第二个函数的代码

_wfinddata_t fd;
_wfindfirst
_wfindnext
_findclose
如果使用这些方法确定文件夹中的元素,则可以免费获得GetFileAttributes结果


如果使用这些方法确定文件夹中的元素,则可以免费获得GetFileAttributes结果。

只需使用
GetFileAttributes()
opendir
closedir
的速度不会更快(您是否对其进行了分析?是否重复了测试以避免缓存效应?)

是的,
GetFileAttributes()
是准确的。您认为它失败的原因是,当您尝试获取
页面文件.sys的属性时,它失败并返回
无效的文件属性,即
(DWORD)-1
。当您使用
FILE\u ATTRIBUTE\u DIRECTORY
测试时,它返回true,因为
-1
中设置了每个位


您在多少个文件上运行此操作?无论您使用什么函数,这都将是一个I/O绑定操作,因为为了确定文件的属性,必须从磁盘(或磁盘缓存)读取父目录。

只需使用
GetFileAttributes()
opendir
closedir
的速度不会更快(您是否对其进行了分析?是否重复了测试以避免缓存效应?)

是的,
GetFileAttributes()
是准确的。您认为它失败的原因是,当您尝试获取
页面文件.sys的属性时,它失败并返回
无效的文件属性,即
(DWORD)-1
。当您使用
FILE\u ATTRIBUTE\u DIRECTORY
测试时,它返回true,因为
-1
中设置了每个位


您在多少个文件上运行此操作?无论您使用什么函数,这都将是一个I/O绑定的操作,因为为了确定文件的属性,必须从磁盘(或磁盘缓存)读取父目录。

您为什么说
GetFileAttributes
很慢。我不相信你能更快地找到任何东西。我发现很难相信某些文件(如pagefile.sys)的
FILE\u属性\u目录
标志处于启用状态。也许
GetFileAttributes
最终会返回一个错误代码-1,它将所有的位都设置为setI注释掉,没有它会更快。在Linux上,速度更快(因为我不必这样做)。如果一个目录中有2K个文件,而您最近没有对它们调用
GetFileAttributes
,这可能需要几秒钟的时间。瓦尔多,谢谢,就是这样!是的,
nop
确实非常快,但这并不意味着所有程序都可以像
nop
一样快。你为什么说
GetFileAttributes
很慢呢。我不相信你能更快地找到任何东西。我发现很难相信某些文件(如pagefile.sys)的
FILE\u属性\u目录
标志处于启用状态。也许
GetFileAttributes
最终会返回一个错误代码-1,它将所有的位都设置为setI注释掉,没有它会更快。在Linux上,速度更快(因为我不必这样做)。如果一个目录中有2K个文件,而您最近没有对它们调用
GetFileAttributes
,这可能需要几秒钟的时间。瓦尔多,谢谢,就是这样!请把它作为一个答案。是的,
nop
确实非常快,但这并不意味着所有程序都可以像
nop
一样运行。是的,就是这样,谢谢。我没有为此使用opendir/closedir,它只是确定代码中的其他地方是否存在目录(并且是多平台的)。我使用的方法是opendir/readdir来读取文件,因为它是multi-patform。是的,就是这样,谢谢。我没有为此使用opendir/closedir,它只是确定代码中的其他地方是否存在目录(并且是多平台的)。我使用的方法是opendir/readdir来读取文件,因为它是多格式的。谢谢,但我希望我的大部分代码尽可能与平台无关。但是如果我有一些空闲时间来修改代码,我会考虑你的建议。谢谢,但是我希望尽可能多地保持我的代码与平台无关。但是如果我有一些空闲时间来修改代码,我会考虑你的建议。