WIN32核心编程 - 文件系统 - 文件搜索和遍历 - 目录操作 - 路径解析

目录

文件搜索和遍历

搜索文件和目录

递归遍历目录

定位指定文件

示例代码

目录操作

绝对路径和相对路径


文件搜索和遍历

搜索文件和目录
  • 在Windows中,您可以使用FindFirstFile和FindNextFile函数来搜索文件和目录。这些函数允许您通过提供匹配规则来搜索指定路径下的文件和目录。
递归遍历目录
  • 递归遍历目录是指遍历一个目录并在其子目录中继续遍历的过程。在Windows中,您可以编写递归函数来实现目录的深度优先遍历,以访问目录结构中的所有文件和子目录。
定位指定文件
  • SearchPath 函数用于在系统中搜索指定文件。它按照特定的顺序搜索文件,包括环境变量指定的路径、当前目录、系统目录、PATH环境变量中的目录等。
  • 搜索顺序:SearchPath 函数按照一定的顺序搜索文件,首先是应用程序的当前目录,然后是系统目录,接着是PATH环境变量中的目录。
  • 搜索标志:可以指定不同的搜索标志,如SEARCH_DEFAULT_DIRS(使用默认搜索顺序)和SEARCH_USER_DIRS(搜索用户目录)。
  • #include <iostream>
    #include <Windows.h>
    
    int main()
    {
    	CONST WCHAR* FileName = L"Dbgview.exe";
    	CONST WCHAR* DefaultSearchPath = L"D:\\Debug\\";
    	WCHAR szBuffer[MAX_PATH] = { 0 };
    	
    	DWORD dwLength =  SearchPath(
    		DefaultSearchPath,
    		FileName,
    		NULL,
    		MAX_PATH,
    		szBuffer,
    		NULL);
    
    	if (dwLength == NULL) return 1;
    
    	std::wcout << szBuffer << std::endl;
    
    	return 0;
    }
示例代码
#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");
    	}

绝对路径和相对路径

  • 绝对路径:从根目录开始到文件或目录的完整路径。

  • 相对路径:相对于当前工作目录的路径。

  • 路径解析:将路径分解为各个组成部分,如驱动器、目录、文件名等。

  • 规范化:去除路径中的冗余部分,如..(上一级目录)和.(当前目录)。

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值