我正在编写一个适用于Windows和Linux的虚拟文件系统。这是一项任务,所以不允许像Boost这样的外部事情。对于Windows版本,我正在尝试编写一个函数来安装给定目录中的所有文件。这是函数:
void FileSystem::MountDirectory(const std::string directory)
{
WIN32_FIND_DATA search_data;
memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
std::wstring wDir = StringToWstring(directory);
LPCWSTR dir = wDir.c_str();
HANDLE handle = FindFirstFile(dir, &search_data);
if (handle == INVALID_HANDLE_VALUE)
{
std::cout << "ERROR: Unable to mount files in path: " << directory << std::endl;
}
else
{
while (handle != INVALID_HANDLE_VALUE)
{
std::string fileName = WCHARArrayToString(search_data.cFileName);
File file(fileName, directory);
m_MountedFiles.push_back(file);
std::cout << "Succesfully mounted the file: " << fileName << std::endl;
if (FindNextFile(handle, &search_data) == FALSE)
{
std::cout << "No more files to mount." << std::endl;
break;
}
}
}
FindClose(handle);
}
我做了一些内联函数帮助从std :: string转换为std :: wstring,反之亦然。我在main.cpp中创建一个FileSystem对象,并在我的D:驱动器上的TestFolder路径上调用MountDirectory:
“d:\ TestFolder \ *。*”
到目前为止,这段代码有效,但在我的测试文件夹的输出中,它总是在其余文件之前打印出来:
成功安装了文件:。
成功安装了文件:..
为什么WIN32_FIND_DATA会选择这些“文件”,如何防止它?
答案 0 :(得分:3)
分别代表当前目录和父目录。如果您枚举所有文件和目录,那么您将无法抑制枚举这些对象。如果您不想打印它们,请让代码检测并忽略它们。