我在一个独立于操作系统的文件管理器上工作,我在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。由于某些原因,无法为第二个函数正确格式化代码。
答案 0 :(得分:5)
只需使用GetFileAttributes()
即可。 opendir
和closedir
不会更快(您是否对其进行了分析?您是否重复了测试以避免缓存效应?)。
是的,GetFileAttributes()
准确无误。您认为失败的原因是因为当您尝试获取pagefile.sys
的属性时,它会失败并返回INVALID_FILE_ATTRIBUTES
,即(DWORD)-1
。当您使用FILE_ATTRIBUTE_DIRECTORY
对其进行测试时,它会返回true,因为-1
中已设置了每一位。
你在运行多少个文件?无论你使用什么函数,这将是一个I / O绑定操作,因为为了确定文件的属性,必须从磁盘(或磁盘缓存)读取父目录。
答案 1 :(得分:1)
_wfinddata_t fd;
_wfindfirst
_wfindnext
_findclose
如果您使用这些方法来确定文件夹中的元素,则可以免费获得GetFileAttributes结果。