- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
文件搜索和遍历
搜索文件和目录
- 在Windows中,您可以使用FindFirstFile和FindNextFile函数来搜索文件和目录。这些函数允许您通过提供匹配规则来搜索指定路径下的文件和目录。
递归遍历目录
- 递归遍历目录是指遍历一个目录并在其子目录中继续遍历的过程。在Windows中,您可以编写递归函数来实现目录的深度优先遍历,以访问目录结构中的所有文件和子目录。
定位指定文件
- SearchPath 函数用于在系统中搜索指定文件。它按照特定的顺序搜索文件,包括环境变量指定的路径、当前目录、系统目录、PATH环境变量中的目录等。
- 搜索顺序:SearchPath 函数按照一定的顺序搜索文件,首先是应用程序的当前目录,然后是系统目录,接着是PATH环境变量中的目录。
- 搜索标志:可以指定不同的搜索标志,如SEARCH_DEFAULT_DIRS(使用默认搜索顺序)和SEARCH_USER_DIRS(搜索用户目录)。
示例代码
#include <iostream>
#include <string>
#include <Windows.h>
bool SimplePatternMatch(const wchar_t* pattern, const wchar_t* filename) {
const wchar_t* mp = nullptr;
const wchar_t* cp = nullptr;
while (*filename) {
if (*pattern == L'*') {
if (!*++pattern) {
return true;
}
mp = pattern;
cp = filename + 1;
}
else if (*pattern == *filename) {
pattern++;
filename++;
}
else {
pattern = mp;
filename = cp++;
}
}
while (*pattern == L'*')
{
pattern++;
}
return !*pattern;
}
VOID SearchFile(CONST std::wstring& Directory, const std::wstring& filter)
{
WIN32_FIND_DATA FileData = { 0 };
HANDLE hFind = FindFirstFile((Directory + L"\\*").c_str(), &FileData);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (wcscmp(FileData.cFileName, L".") != 0 && wcscmp(FileData.cFileName, L"..") != 0)
{
std::wstring SubDir = Directory + L"\\" + FileData.cFileName;
SearchFile(SubDir, filter);
}
}
else
{
// 进行文件过滤
if (SimplePatternMatch(filter.c_str(), FileData.cFileName))
{
std::wcout << Directory << L"\\" << FileData.cFileName << std::endl;
}
}
} while (FindNextFile(hFind, &FileData) != NULL);
FindClose(hFind);
}
}
int main()
{
std::wstring strDirectory = L"D:\\Debug";
std::wstring filter = L"*.exe";
SearchFile(strDirectory, filter);
return 0;
}
目录操作
- 在Windows核心编程中,目录(或文件夹)的操作包括创建、删除和重命名。这些操作通常通过CreateDirectory、RemoveDirectory和MoveFileEx(或MoveFileWithProgress)等函数来实现。
- GetCurrentDirectory用于获取当前运行目录。
-
// 获取运行目录 TCHAR szBuffer1[MAX_PATH] = { 0 }; DWORD dwSize = GetCurrentDirectory(MAX_PATH, szBuffer1); if (dwSize != NULL) { std::wcout << szBuffer1 << std::endl; system("pause"); }
- CreateDirectory用于创建新目录。
-
// 创建目录 if (CreateDirectory(L"NewDirectory", NULL) != NULL) { //ERROR_ALREADY_EXISTS 当文件已存在时,无法创建该文件 std::wcout << "Create NewDirectory" << std::endl; system("pause"); }
- RemoveDirectory用于删除空目录。
-
// 删除目录 if (RemoveDirectory(L"NewDirectory") != NULL) { std::wcout << "Remove NewDirectory" << std::endl; system("pause"); }
绝对路径和相对路径
-
绝对路径:从根目录开始到文件或目录的完整路径。
-
相对路径:相对于当前工作目录的路径。
-
路径解析:将路径分解为各个组成部分,如驱动器、目录、文件名等。
-
规范化:去除路径中的冗余部分,如
..
(上一级目录)和.
(当前目录)。