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

Rad*_*adu 1 c winapi

我在一个独立于操作系统的文件管理器上工作,我在Windows上正确检测文件是否是目录时遇到问题.direntWindows上的结构似乎没有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;
Run Code Online (Sandbox Code Playgroud)

但是,这并不总是准确的,因为某些文件被标记为目录(例如,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;
  }
Run Code Online (Sandbox Code Playgroud)

但这很慢(在10000个文件上做这个不是一个好主意).

当然,我可以将两者结合得非常快,但有更好的方法吗?

PS由于某些原因无法为第二个功能正确格式化代码.

Ada*_*eld 5

只是用GetFileAttributes(). opendir并且closedir不会更快(你是否对它进行了分析?你是否重复了测试以避免缓存效应?).

是的,GetFileAttributes() 准确的.你认为它失败的原因是因为当你试图获得属性时pagefile.sys,它会失败并返回INVALID_FILE_ATTRIBUTES,这就是(DWORD)-1.当你用FILE_ATTRIBUTE_DIRECTORY它测试时,它返回true,因为-1它中设置了每一位.

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