Joh*_*bia 9 c++ windows winapi directory-listing
我有这个代码,它显示目录本身的文件夹,而不是其内容.我想显示它的内容.我不想使用boost :: filesystem.
我该如何解决这个问题?
码:
#include <windows.h>
#include <iostream>
int main()
{
WIN32_FIND_DATA data;
HANDLE hFind = FindFirstFile("C:\\semester2", &data); // DIRECTORY
if ( hFind != INVALID_HANDLE_VALUE ) {
do {
std::cout << data.cFileName << std::endl;
} while (FindNextFile(hFind, &data));
FindClose(hFind);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
semester2
Run Code Online (Sandbox Code Playgroud)
Har*_*ton 13
HANDLE hFind = FindFirstFile("C:\\semester2", &data); // DIRECTORY
Run Code Online (Sandbox Code Playgroud)
你得到了这个目录,因为那就是你要求的.如果您需要这些文件,请询问:
HANDLE hFind = FindFirstFile("C:\\semester2\\*", &data); // FILES
Run Code Online (Sandbox Code Playgroud)
(*.*
如果你愿意,你可以改用它,但显然这只能起作用,因为它具有向后兼容性,所以应该避免使用.请参阅注释和RbMm的答案.)
让我带的一些笔记"*.*"
VS "*"
.这些报送者不相等.
我们的文件夹中可以存在2个不同的文件:somefile
和somefile.
.
如果我们使用的低级别的API ZwQueryDirectoryFile
与"*.*"
作为搜索表达式(这是第十个参数- FileName [in, optional]
)-我们会得到somefile.
唯一的.但是,如果我们使用,"*"
我们将获得两个文件 - somefile
和somefile.
如果我们尝试,FindFirstFile("C:\\semester2\\*.*", &data);
我们可以注意到两个文件somefile
并somefile.
返回.所以这里"*.*"
vs "*"
具有相同的效果 - 使用没有区别.
为什么会这样?因为在FindFirstFileEx
in kernelbase
(kernel32
)内部"*.*"
会对mask 进行特殊检查,如果为true,则替换为""
(具有相同效果的空名称"*"
).
我认为这样做是为了在用户通过"*.*"
而不是正确的"*"
以及与遗留代码的向后兼容性时修复一个非常常见的错误.
.
并且..
它实际上不是目录的一部分,因为它存储在磁盘上,但是由Win32 API添加.
这不是真的.
FAT
style文件系统这实际上存储在FAT目录中作为第一个条目. NTFS
没有这样的条目,但NTFS.sys
如果他们在掩码中人为地添加这两个条目.所以这不是在Win32 API级别,而是在内核 - 驱动程序级别.
总而言之,"*.*"
现在使用Win32 API可以正常工作 - 但是正确和干净的方法是在"*"
这里使用.
"*.*"
将ZwQueryDirectoryFile
api 错误.