C 如何确定文件是否为目录(最佳方式)
我在一个独立于操作系统的文件管理器中工作,在正确检测文件是否是Windows上的目录时遇到问题。 windows上的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; 但是,这并不总是准确
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来读取文件,因为它是多格式的。谢谢,但我希望我的大部分代码尽可能与平台无关。但是如果我有一些空闲时间来修改代码,我会考虑你的建议。谢谢,但是我希望尽可能多地保持我的代码与平台无关。但是如果我有一些空闲时间来修改代码,我会考虑你的建议。