当前位置: 首页 > news >正文

小练习 - 复制,移动,迭代文件,迭代删除目录

前言

  • 各位师傅大家好,我是qmx_07,今天对前面的知识,进行小练习
    在这里插入图片描述

拷贝文件CopyFile

BOOL MyCopyFile(const CHAR* src, const CHAR* det)
{HANDLE hFileSrc = CreateFile(src, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hFileSrc){cout << GetLastError() << endl;return FALSE;}LARGE_INTEGER FileSize;if (!GetFileSizeEx(hFileSrc, &FileSize)){cout << GetLastError() << endl;return FALSE;}CHAR* Buffer = new CHAR[FileSize.LowPart + 1];memset(Buffer, 0, FileSize.LowPart + 1);DWORD NumRead = 0;BOOL Ret = ReadFile(hFileSrc, Buffer, FileSize.LowPart + 1, &NumRead, NULL);if (!Ret){cout << GetLastError() << endl;return FALSE;}HANDLE hFileDet = CreateFile(det, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);DWORD length = strlen(Buffer);DWORD NumWrite = 0;Ret = WriteFile(hFileDet, Buffer, length, &NumWrite, NULL);if (!Ret){cout << GetLastError() << endl;return FALSE;}CloseHandle(hFileSrc);CloseHandle(hFileDet);return TRUE;
}
  • 思路:拷贝文件是读取文件的内容数据,再写入另一个文件,从而完成复制
  • 建议手写一下 锻炼一下手敲代码的能力
  • 画面演示:
    在这里插入图片描述

移动文件MoveFile

BOOL MyMoveFile(const CHAR* src , const CHAR* det)
{HANDLE hFileSrc = CreateFile(src, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hFileSrc){cout << GetLastError() << endl;return FALSE;}LARGE_INTEGER FileSize;if (!GetFileSizeEx(hFileSrc, &FileSize)){cout << GetLastError() << endl;return FALSE;}CHAR* Buffer = new CHAR[FileSize.LowPart + 1];memset(Buffer, 0, FileSize.LowPart + 1);DWORD NumRead = 0;BOOL Ret = ReadFile(hFileSrc, Buffer, FileSize.LowPart + 1, &NumRead, NULL);if (!Ret){cout << GetLastError() << endl;return FALSE;}HANDLE hFileDet = CreateFile(det, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);DWORD length = strlen(Buffer);DWORD NumWrite = 0;Ret = WriteFile(hFileDet, Buffer, length, &NumWrite, NULL);if (!Ret){cout << GetLastError() << endl;}CloseHandle(hFileSrc);CHAR* tempSrc = const_cast<CHAR*>(src);if (!DeleteFile(tempSrc)){DWORD error = GetLastError();cout << "删除文件失败,错误码: " << error << endl;return FALSE;}CloseHandle(hFileDet);return TRUE;
}
  • 思路: 其实与CopyFile一样,都是读取文件 写入文件操作,但是 要用DeleteFile函数将原文件清除
  • CHAR* tempSrc = const_cast<CHAR*>(src); 将const CHAR* 去除const常量属性,能够修改
  • 画面演示:
    在这里插入图片描述

递归遍历文件函数

BOOL recurseDirectory(const CHAR* src)
{char NewDir[100];strcpy(NewDir, src);strcat(NewDir, "\\*");WIN32_FIND_DATA FindFileData;HANDLE hFind = FindFirstFile(NewDir, &FindFileData);if (INVALID_HANDLE_VALUE == hFind){cout << GetLastError() << endl;return FALSE;}do {if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 && strcmp(FindFileData.cFileName, ".") != 0 &&strcmp(FindFileData.cFileName, "..") != 0){strcpy(NewDir, src);strcat(NewDir, "\\");strcat(NewDir, FindFileData.cFileName);recurseDirectory(NewDir);}else{if (strcmp(FindFileData.cFileName, ".") != 0 && strcmp(FindFileData.cFileName, "..") != 0){SYSTEMTIME SystemTime;FileTimeToSystemTime(&FindFileData.ftCreationTime, &SystemTime);std::cout << SystemTime.wYear << "-" << SystemTime.wMonth << "-" << SystemTime.wDay << " ";if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){std::cout << "<DIR>" << " ";}std::cout << FindFileData.cFileName << std::endl;}}} while (FindNextFile(hFind, &FindFileData));CloseHandle(hFind);return TRUE;
}
  • 通过创建NewDir,利用strcat拼接路径,进行迭代判断输出
  • 画面演示:
    素材:
    在这里插入图片描述
    在这里插入图片描述

删除非空目录


void DeleteDirectory(const std::string& directoryPath)
{WIN32_FIND_DATA findFileData;HANDLE hFind = FindFirstFile((directoryPath + "\\*").c_str(), &findFileData);if (hFind == INVALID_HANDLE_VALUE){return;}do {if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){if (strcmp(findFileData.cFileName, ".") != 0 && strcmp(findFileData.cFileName, "..") != 0){DeleteDirectory(directoryPath + "\\" + findFileData.cFileName);}}else{std::string filePath = directoryPath + "\\" + findFileData.cFileName;DeleteFile(filePath.c_str());}} while (FindNextFile(hFind, &findFileData));FindClose(hFind);RemoveDirectory(directoryPath.c_str());
}
  • 使用RemoveDirectory可以删除空目录
  • 通过迭代到最里面的目录,删除所有文件,最后进行删除目录
  • 画面演示:
    在这里插入图片描述

总结

  • 通过前面的学习,实现了复制,移动,迭代文件,迭代删除目录的功能

http://www.mrgr.cn/news/50455.html

相关文章:

  • 双十一投影仪哪个好?三千元左右,当贝D6X Pro家用首选
  • 计数杂题选做(1)
  • 代码随想录训练营Day34 | 134. 加油站 | 135. 分发糖果 | 860.柠檬水找零 | 406.根据身高重建队列
  • Vue 上传图片前 裁剪图片
  • Loss:CornerNet: Detecting Objects as Paired Keypoints
  • 【软件考试】错误校验码-奇偶校验码,CRC,海明码...
  • 漏扫工具Appscan使用(非常详细)从零基础入门到精通,看完这一篇就够了。
  • 基于SSM出租车管理系统的设计
  • PHP B2C购物系统小程序-计算机毕业设计源码95294
  • SAP 更改代理类型字段
  • ​时间序列预测(五)——优化器(Optimizer)、学习率
  • LLaMA-Factory 让大模型微调变得更简单!!
  • 解读 ASS:Uniswap 应用链 Unichain 的排序机制
  • 统一时序预测模型,上下文长度首次扩展至千级别!!!
  • 重生之我在代码随想录刷算法第二十四天 | 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II
  • 索引设计的原则主要包括以下几点:
  • 云商城系统如何降低长期成本
  • Colorful/七彩虹隐星P16 23 Win11原厂OEM系统 带COLORFUL一键还原
  • 香橙派刷机和开发环境准备(ubuntu22.04版)_随记1
  • 成都跃享未来教育咨询有限公司抖音小店共绘教育篇章