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

时间:2011-10-20 20:55:43

标签: 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;

但是,这并不总是准确的,因为有些文件被标记为目录(例如,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。由于某些原因,无法为第二个函数正确格式化代码。

2 个答案:

答案 0 :(得分:5)

只需使用GetFileAttributes()即可。 opendirclosedir不会更快(您是否对其进行了分析?您是否重复了测试以避免缓存效应?)。

是的,GetFileAttributes() 准确无误。您认为失败的原因是因为当您尝试获取pagefile.sys的属性时,它会失败并返回INVALID_FILE_ATTRIBUTES,即(DWORD)-1。当您使用FILE_ATTRIBUTE_DIRECTORY对其进行测试时,它会返回true,因为-1中已设置了每一位。

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

答案 1 :(得分:1)

_wfinddata_t fd;
_wfindfirst
_wfindnext
_findclose

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