最近学习操作系统中,老师布置了一个作业,运用系统调用函数删除文件夹下两个重复文本类文件,Linux玩不动,于是就只能在Windows下进行了。
看了一下介绍Windows API的博客:
基本就开始动手了。
主要利用的函数其实就那么几个:
CreateFile 创建、打开文件
ReadFile 读取文件内容
DeleteFile 文件删除
FindFirstFile 查找指定目录下的第一个文件
FindNextFile 查找下一个文件
GetFileAttributes 获取文件属性
主要过程就是用FindFirstFile,FindNextFile函数扫一遍文件夹,将所有文件路径找出来,有文件夹的话递归往下寻找文件,所有文件路径放在一个字符数组中。
然后就是二重循环枚举,读出文件到缓冲区,两两比较,相等的话随便删掉一个,将待删掉的文件编号存入容器DelList中,最后扫一遍容器进行删除。
代码:

#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <windows.h> #define MAX_CNT 102 #define MAX_LENGTH 102 using namespace std; CHAR inputPath[MAX_PATH]; CHAR FileName[MAX_CNT][MAX_LENGTH]; int File_Cnt,OPEN_SUCCESS; vector<int> DelList; void input() { puts("Please input the Directory name: <For example: C:\whatbeg..>"); scanf("%s",inputPath); } int StrCompare(const char *ss1, const char *ss2) //相同返回1 { int len1 = strlen(ss1), len2 = strlen(ss2); if(len1 != len2) return 0; for(int i = 0 ; i < len1 ; i++) if(ss1[i] != ss2[i]) return 0; return 1; } void GetAllFileNameInDirectory(CONST CHAR *nowpath) { DWORD Attrs; // 文件属性 CHAR path[MAX_PATH] = {0}; // 待列路径 CHAR concretePath[MAX_PATH]; // 具体查找路径 HANDLE hlistfile; // 获取到的文件句柄 WIN32_FIND_DATA fileData; // 查找到的文件数据 memmove(path, nowpath, strlen(nowpath)); lstrcpy(concretePath, path); // 复制路径到具体查找路径 lstrcat(concretePath, "\*"); // 路径拼接通配符 lstrcat(path, "\"); hlistfile = FindFirstFile(concretePath, &fileData); // 查找路径下第一个文件/目录,获得句柄 if(hlistfile == INVALID_HANDLE_VALUE) { // 判断句柄是否获取到 printf("Error: %d ",GetLastError()); return; } else { do { Attrs = fileData.dwFileAttributes; if(Attrs & FILE_ATTRIBUTE_DIRECTORY) { //判断文件是否是目录 CHAR SubDirectory[MAX_PATH]; lstrcpy(SubDirectory, path); lstrcat(SubDirectory, fileData.cFileName); //忽略 . 或 .. 的文件名 if(!StrCompare(fileData.cFileName, ".") && !StrCompare(fileData.cFileName, "..")) GetAllFileNameInDirectory(SubDirectory); //该文件是目录,递归查找 } else { //是文件而非目录 //printf("%s ",fileData.cFileName); lstrcpy(FileName[++File_Cnt], path); lstrcat(FileName[File_Cnt], fileData.cFileName); } }while(FindNextFile(hlistfile, &fileData)); // 查找下一个文件 } return; } void OpenFile(HANDLE &handle, int FS) { //打开文件 handle = CreateFile( FileName[FS], // 文件名 GENERIC_READ, // 读取权限 0, // 阻止其他进程访问 NULL, // 子进程不可继承本句柄 OPEN_EXISTING, // 仅当该文件或设备存在时,打开它 FILE_ATTRIBUTE_NORMAL, // 普通文件 NULL // 不适用模板文件 ); if (handle == INVALID_HANDLE_VALUE) { printf("无法打开文件 "%s" ", FileName[FS]); OPEN_SUCCESS = false; return; } } void CompareAndGetDelList() { HANDLE File_01,File_02; DWORD FileSize_01,FileSize_02; DWORD ReadSize_01,ReadSize_02; char *Buffer_01, *Buffer_02; DelList.clear(); bool HaveDiffrent; for(int First = 1 ; First <= File_Cnt ; First++) { HaveDiffrent = false; for(int Second = First + 1 ; Second <= File_Cnt ; Second++) { OPEN_SUCCESS = true; OpenFile(File_01,First); OpenFile(File_02,Second); FileSize_01 = GetFileSize(File_01, NULL); FileSize_02 = GetFileSize(File_02, NULL); // printf("First,Second = %d %d ",First,Second); // printf("Filesize1,2 = %d %d ",FileSize_01,FileSize_02); // cout<<"OPENSUCCESS = "<<(OPEN_SUCCESS?1:0)<<endl; if(OPEN_SUCCESS && FileSize_01 == FileSize_02) { Buffer_01 = (CHAR *)malloc(FileSize_01 + 3); Buffer_01[FileSize_01] = '