【Windows系统编程】01.文件与目录操作-笔记

这篇具有很好参考价值的文章主要介绍了【Windows系统编程】01.文件与目录操作-笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本专栏从这篇文章开始做Windows系统编程的笔记,本章主要讲解:Windows文件操作(读写文件,删除文件,拷贝文件,移动文件等),目录操作(遍历目录,删除目录等)硬盘的一点小知识。
参考书:Windows核心编程

文件,内核对象

#include <iostream>
#include <Windows.h>

int main()
{
	//打开文件或I/O设备
	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt",   //文件名
		GENERIC_READ | GENERIC_WRITE,                   //打开方式
		NULL,                                           //共享模式,这里NULL是独占
		NULL,                                           //安全属性
		OPEN_ALWAYS,                                    //要对存在或不存在的文件或设备进行的操作
		FILE_ATTRIBUTE_NORMAL,                          //文件或设备属性
		NULL
	);

	//INVALID_HANDLE_VALUE宏是微软提出的专门用于判断句柄是否有效的宏
	if (hFile == INVALID_HANDLE_VALUE) {
		std::cout << "CreateFile Failed!" << std::endl;
	}

	//定义我们要写入文件的字符串
	CHAR* szBuffer[MAX_PATH] = { 0 };
	memcpy(szBuffer, "Hello Windows File!", sizeof("Hello Windows File!"));

	DWORD dwNumberOfBytesWritten = 0;
	BOOL bRet = WriteFile(
		hFile,                    //文件句柄
		szBuffer,                 //字符串地址
		sizeof("Hello Windows File!"),//写入文件大小
		&dwNumberOfBytesWritten,
		NULL
	);

	if (!bRet) {
		std::cout << "WriteFile Faild!" << std::endl;
	}

	CloseHandle(hFile);
	system("pause");
	return 0;
}

上述的是没有错误的操作流程

如果文件已经存在的话,就会出现错误

我们在开发过程中,如何定位错误?

监视->添加监视:err,hr

这样,如果出现错误,错误原因也就会显示了

或者,复制错误码,在工具:错误查找中,查找错误原因

或者:

std::cout<<GetLaseError()<<std::endl;
这样会直接打印出错误码
  • 读文件:

    #include <iostream>
    #include <Windows.h>
    
    int main()
    {
    	//打开文件或I/O设备
    	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt",   //文件名
    		GENERIC_READ | GENERIC_WRITE,                   //打开方式
    		NULL,                                           //共享模式,这里NULL是独占
    		NULL,                                           //安全属性
    		OPEN_ALWAYS,                                    //要对存在或不存在的文件或设备进行的操作
    		FILE_ATTRIBUTE_NORMAL,                          //文件或设备属性
    		NULL
    	);
    
    	//INVALID_HANDLE_VALUE宏是微软提出的专门用于判断句柄是否有效的宏
    	if (hFile == INVALID_HANDLE_VALUE) {
    		std::cout << "CreateFile Failed!" << std::endl;
    	}
    
    	//获取文件大小
    	LARGE_INTEGER lpFileSize;
    	/*
    	typedef union _LARGE_INTEGER {
    		struct {
    			DWORD LowPart;
    			LONG HighPart;
    		} DUMMYSTRUCTNAME;
    		struct {
    			DWORD LowPart;
    			LONG HighPart;
    		} u;
    		LONGLONG QuadPart;
    	} LARGE_INTEGER;
    	*/
    	if (!GetFileSizeEx(hFile, &lpFileSize
    		)) {
    		std::cout << "GetFileSize Failed!" << std::endl;
    		std::cout << "错误码:" << GetLastError() << std::endl;
    	}
    
    	//定义我们要读出文件的字符串
    	CHAR* szBuffer = new CHAR[lpFileSize.LowPart + 1];
    	memset(szBuffer, 0, lpFileSize.LowPart + 1);
    
    	DWORD lpNumberOfBytesRead;
    	BOOL bRet = ReadFile(hFile,
    		szBuffer,
    		lpFileSize.LowPart,
    		&lpNumberOfBytesRead,
    		NULL
    	);
    
    	if (bRet) {
    		std::cout << szBuffer << std::endl;
    	}
    	else {
    		std::cout << "ReadFile Faild!" << std::endl;
    	}
    
    	CloseHandle(hFile);
    	system("pause");
    	return 0;
    }
    
    
  • 移动文件:

    	//移动文件
    	if (MoveFile(L"E:\\Test A\\111.txt", L"E:\\Test B\\222.txt")) {
    		std::cout << "移动成功" << std::endl;
    	}
    	else {
    		std::cout << "移动失败!" << std::endl;
    	}
    
    	//删除文件
    	if (DeleteFile(L"E:\\Test B\\222.txt")) {
    		std::cout << "删除成功" << std::endl;
    	}
    	else {
    		std::cout << "删除失败!" << std::endl;
    	}
    
    	//拷贝文件
    	if (CopyFile(L"E:\\Test B\\222 - 副本.txt", L"E:\\Test A\\111.txt", TRUE)) {
    		std::cout << "移动成功" << std::endl;
    	}
    	else {
    		std::cout << "移动失败!" << std::endl;
    	}
    
    

目录

	//创建新目录:
	CreateDirectory(L"E:\\Test C", NULL);
	//删除目录(只能删除空目录):
	RemoveDirectory(L"E:\\Test C");

	//遍历文件目录:
	WIN32_FIND_DATAW FindFileData;
	HANDLE hFile = FindFirstFile(L"E:\\*", &FindFileData);

	if (hFile == INVALID_HANDLE_VALUE) {
		std::cout << "FindFirstFile Failed" << std::endl;
	}

	do {
		//判断是否为目录:
		if (FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) {
			std::cout << "(Directory)";
		}

		std::cout << FindFileData.cFileName << ":";
		
		//处理时间:
		SYSTEMTIME Systime;
		FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
		std::cout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay << "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;


	} while (FindNextFile(hFile, &FindFileData));

.:当前路径

…:上级路径

一般如果想要遍历C盘文件,需要手动提权,或者:

属性页-连接器-清单文件,UAC执行级别:设置高级

获取单个文件详细信息

#include <iostream>
#include <windows.h>

int main(){
	//获取单个文件详细信息:
	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPWN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	BY_HANDLE_FILE_INFORMATION bhFileInfo;
	GetFileInformationByHandle(hFile, &bhFileInfo);
  std::cout<<......<<std::endl;
  system("pause");
  return 0;
}

盘符

A-Z

Z之后,挂硬盘挂不上去

A,B盘是软盘

获取磁盘类型:

UINT uRet = GetDriveType("C:");

查询磁盘相关信息:

GetVolumeInformation()

获取磁盘大小:

GetDiskFreeSpace("D:\\",...)

硬盘(卷)GUIID:文章来源地址https://www.toymoban.com/news/detail-645855.html

char szvolume[MAX_PATH]={0};
HANDLE hVolume = FindFirstVolume(szVolume,MAX_PATH);
std::cout<<szVolume<<std::endl;
while(FindNextVolume(hVolume,szVolume,MAX_PATH)){
  std::cout<<szVolume<<std::endl;
}
FindVolumeClostd(hVolume);

作业

  1. 自己实现拷贝文件功能(CopyFile)
    BOOL MyCopyFile(LPCWSTR Src, LPCWSTR New,BOOL nFlag)
    {
    	HANDLE hSrcFile = NULL;
    	switch (nFlag) {
    	case FALSE: {
    		hSrcFile = CreateFile(Src, GENERIC_READ, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    		if (hSrcFile == INVALID_HANDLE_VALUE) {
    			std::cout << "CreateFile Failed" << std::endl;
    			return FALSE;
    		}
    	}
    	case TRUE: {
    		hSrcFile = CreateFile(Src, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    		if (hSrcFile == INVALID_HANDLE_VALUE) {
    			std::cout << "CreateFile Failed" << std::endl;
    			return FALSE;
    		}
    	}
    	}
    
    	LARGE_INTEGER lpFileSize;
    	if (!GetFileSizeEx(hSrcFile, &lpFileSize)) {
    		std::cout << "GetFileSize Failed" << std::endl;
    		std::cout << GetLastError() << std::endl;
    		return FALSE;
    	}
    
    	CHAR* szBuffer = new CHAR[lpFileSize.LowPart + 1];
    	if (szBuffer == nullptr) {
    		std::cout << "申请内存失败!" << std::endl;
    		return FALSE;
    	}
    	memset(szBuffer, 0, lpFileSize.LowPart + 1);
    
    	DWORD lpNumberOfBytesRead;
    	BOOL bRet = ReadFile(hSrcFile, szBuffer, lpFileSize.LowPart, &lpNumberOfBytesRead, NULL);
    	if (!bRet) {
    		std::cout << "ReadFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	HANDLE hNewFile = CreateFile(New, GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hNewFile == INVALID_HANDLE_VALUE) {
    		std::cout << "CreateFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	DWORD lpNumberOfBytesWritten;
    	bRet = WriteFile(hNewFile, szBuffer, lpFileSize.LowPart, &lpNumberOfBytesWritten, NULL);
    	if (!bRet) {
    		std::cout << "WriteFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	CloseHandle(hSrcFile);
    	CloseHandle(hNewFile);
    	delete(szBuffer);
    	return TRUE;
    }
    
  2. 自己实现移动文件(MoveFile)功能
    BOOL MyMoveFile(LPCWSTR Src, LPCWSTR New)
    {
    	HANDLE hSrcFile = CreateFile(Src, GENERIC_READ, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hSrcFile == INVALID_HANDLE_VALUE) {
    		std::cout << "CreateFile Failed" << std::endl;
    		return FALSE;
    	}
    
    	LARGE_INTEGER lpFileSize;
    	if (!GetFileSizeEx(hSrcFile, &lpFileSize)) {
    		std::cout << "GetFileSize Failed" << std::endl;
    		std::cout << GetLastError() << std::endl;
    		return FALSE;
    	}
    
    	CHAR* szBuffer = new CHAR[lpFileSize.LowPart + 1];
    	if (szBuffer == nullptr) {
    		std::cout << "申请内存失败!" << std::endl;
    		return FALSE;
    	}
    	memset(szBuffer, 0, lpFileSize.LowPart + 1);
    
    	DWORD lpNumberOfBytesRead;
    	BOOL bRet = ReadFile(hSrcFile, szBuffer, lpFileSize.LowPart, &lpNumberOfBytesRead, NULL);
    	if (!bRet) {
    		std::cout << "ReadFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	HANDLE hNewFile = CreateFile(New, GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hNewFile == INVALID_HANDLE_VALUE) {
    		std::cout << "CreateFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	DWORD lpNumberOfBytesWritten;
    	bRet = WriteFile(hNewFile, szBuffer, lpFileSize.LowPart, &lpNumberOfBytesWritten, NULL);
    	if (!bRet) {
    		std::cout << "WriteFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	DeleteFile(Src);
    
    	CloseHandle(hSrcFile);
    	CloseHandle(hNewFile);
    	delete(szBuffer);
    	return TRUE;
    }
    
  3. 自己实现一个删除非空目录的函数
    void ReadDirectory(LPCWSTR lpDirectory)
    {
    	WIN32_FIND_DATAW FindFileData;
    	HANDLE hFile = FindFirstFile((std::wstring(lpDirectory) + L"\\*").c_str(), &FindFileData);
    
    	if (hFile == INVALID_HANDLE_VALUE) {
    		std::wcout << "FindFirstFile Failed" << std::endl;
    		return;
    	}
    
    	do {
    		// 判断是否为目录:
    		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
    			if (wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0) {
    				// 构建新的路径并递归调用
    				std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    				ReadDirectory(newPath.c_str());
    
    				// 在递归之后删除目录
    				RemoveDirectory(newPath.c_str());
    			}
    		}
    		else {
    			// 构建文件的完整路径
    			std::wstring filePath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    
    			// 删除文件
    			if (DeleteFile(filePath.c_str())) {
    				std::wcout << "Deleted: " << filePath << std::endl;
    			}
    			else {
    				std::wcout << "Failed to delete: " << filePath << std::endl;
    			}
    		}
    	} while (FindNextFile(hFile, &FindFileData));
    	RemoveDirectory(lpDirectory);
    	FindClose(hFile);
    }
    
  4. 自己实现递归遍历文件的函数
    void ReadDirectory(LPCWSTR lpDirectory, int nCount = 0)
    {
    	WIN32_FIND_DATAW FindFileData;
    	HANDLE hFile = FindFirstFile((std::wstring(lpDirectory) + L"\\*").c_str(), &FindFileData);
    
    	if (hFile == INVALID_HANDLE_VALUE) {
    		std::wcout << "FindFirstFile Failed" << std::endl;
    		return;
    	}
    
    	do {
    		// 判断是否为目录:
    		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
    			if (wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0) {
    				std::wcout << std::wstring(nCount, L' ') << "(Directory) ";
    				std::wcout << FindFileData.cFileName << ":";
    
    				// 处理时间:
    				SYSTEMTIME Systime;
    				FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
    				std::wcout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay
    					<< "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;
    
    				// 构建新的路径并递归调用
    				std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    				ReadDirectory(newPath.c_str(), nCount + 1);
    			}
    		}
    		else {
    			std::wcout << std::wstring(nCount, L' ');
    			std::wcout << FindFileData.cFileName << ":";
    
    			// 处理时间:
    			SYSTEMTIME Systime;
    			FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
    			std::wcout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay
    				<< "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;
    		}
    	} while (FindNextFile(hFile, &FindFileData));
    
    	FindClose(hFile);
    }
    
  5. 遍历某一个文件夹的文件后,对其加密(异或)(虚拟机实验)
    // 加密文件夹.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <Windows.h>
    #include <string>
    
    BOOL EncipherFile(LPCWSTR lpDirectory);
    BOOL EncipherDocument(LPCWSTR lpDirectory);
    
    int main()
    {
    	if (EncipherFile(L"E:\\Test")) {
    		std::cout << L"加密完成" << std::endl;
    	}
    	else {
    		std::cout << L"加密失败" << std::endl;
    	}
    }
    
    BOOL EncipherFile(LPCWSTR lpDirectory)
    {
    	WIN32_FIND_DATAW FindFileData;
    	HANDLE hFile = FindFirstFile((std::wstring(lpDirectory) + L"\\*").c_str(), &FindFileData);
    
    	if (hFile == INVALID_HANDLE_VALUE) {
    		std::wcout << "FindFirstFile Failed" << std::endl;
    		return FALSE;
    	}
    
    	do {
    		// 判断是否为目录:
    		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
    			if (wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0) {
    				// 构建新的路径并递归调用
    				std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    				EncipherFile(newPath.c_str());
    			}
    		}
    		else {
    			// 构建文件的完整路径
    			std::wstring filePath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    
    			// 加密文件
    			if (EncipherDocument(filePath.c_str())) {
    				std::wcout << L"Successfull Encipher" << filePath << std::endl;
    			}
    			else {
    				std::wcout << "Failed to Encipher: " << filePath << std::endl;
    			}
    		}
    	} while (FindNextFile(hFile, &FindFileData));
    
    	FindClose(hFile);
    
    	return TRUE;
    }
    
    BOOL EncipherDocument(LPCWSTR lpDirectory)
    {
    	BOOL bRet;
    	HANDLE hFile = CreateFile(lpDirectory, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hFile == INVALID_HANDLE_VALUE) {
    		return FALSE;
    	}
    
    	//获取文件大小
    	LARGE_INTEGER FileSize;
    	bRet = GetFileSizeEx(hFile, &FileSize);
    	if (!bRet) {
    		std::cout << "Faild to GetFileSize" << std::endl;
    		return FALSE;
    	}
    
    	CHAR* szBuffer = new CHAR[FileSize.LowPart + 1];
    	memset(szBuffer, 0, FileSize.LowPart + 1);
    
    	//读文件
    	DWORD lpNumberOfBytesRead;
    	bRet = ReadFile(hFile, szBuffer, FileSize.LowPart, &lpNumberOfBytesRead, NULL);
    	if (!bRet) {
    		std::cout << L"Failed to ReadFile" << std::endl;
    		return FALSE;
    	}
    
    	for (size_t i = 0; i < FileSize.LowPart; i++)
    	{
    		szBuffer[i] ^= 'a';
    	}
    
    	//移动文件指针
    	SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
    
    	//写入文件
    	DWORD lpNumberOfBytesWritten;
    	bRet = WriteFile(hFile, szBuffer, FileSize.LowPart, &lpNumberOfBytesWritten, NULL);
    	if (!bRet) {
    		std::cout << L"Failed to WriteFile!" << std::endl;
    		return FALSE;
    	}
    	std::cout << "Successful Enciph:" << lpDirectory << std::endl;
    
    	CloseHandle(hFile);
    	return 0;
    }
    
    
#include <iostream>
#include <winodws.h>

int main(){
  //ASCII UNICODE
  //相互转换:
  Windows API都有版本: A W EX
  ASCII UNICODE 拓展版本
  
  MessageBox()
  
  system("pause");
  return 0;
}

文件,内核对象

#include <iostream>
#include <Windows.h>

int main()
{
	//打开文件或I/O设备
	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt",   //文件名
		GENERIC_READ | GENERIC_WRITE,                   //打开方式
		NULL,                                           //共享模式,这里NULL是独占
		NULL,                                           //安全属性
		OPEN_ALWAYS,                                    //要对存在或不存在的文件或设备进行的操作
		FILE_ATTRIBUTE_NORMAL,                          //文件或设备属性
		NULL
	);

	//INVALID_HANDLE_VALUE宏是微软提出的专门用于判断句柄是否有效的宏
	if (hFile == INVALID_HANDLE_VALUE) {
		std::cout << "CreateFile Failed!" << std::endl;
	}

	//定义我们要写入文件的字符串
	CHAR* szBuffer[MAX_PATH] = { 0 };
	memcpy(szBuffer, "Hello Windows File!", sizeof("Hello Windows File!"));

	DWORD dwNumberOfBytesWritten = 0;
	BOOL bRet = WriteFile(
		hFile,                    //文件句柄
		szBuffer,                 //字符串地址
		sizeof("Hello Windows File!"),//写入文件大小
		&dwNumberOfBytesWritten,
		NULL
	);

	if (!bRet) {
		std::cout << "WriteFile Faild!" << std::endl;
	}

	CloseHandle(hFile);
	system("pause");
	return 0;
}

上述的是没有错误的操作流程

如果文件已经存在的话,就会出现错误

我们在开发过程中,如何定位错误?

监视->添加监视:err,hr

这样,如果出现错误,错误原因也就会显示了

或者,复制错误码,在工具:错误查找中,查找错误原因

或者:

std::cout<<GetLaseError()<<std::endl;
这样会直接打印出错误码
  • 读文件:

    #include <iostream>
    #include <Windows.h>
    
    int main()
    {
    	//打开文件或I/O设备
    	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt",   //文件名
    		GENERIC_READ | GENERIC_WRITE,                   //打开方式
    		NULL,                                           //共享模式,这里NULL是独占
    		NULL,                                           //安全属性
    		OPEN_ALWAYS,                                    //要对存在或不存在的文件或设备进行的操作
    		FILE_ATTRIBUTE_NORMAL,                          //文件或设备属性
    		NULL
    	);
    
    	//INVALID_HANDLE_VALUE宏是微软提出的专门用于判断句柄是否有效的宏
    	if (hFile == INVALID_HANDLE_VALUE) {
    		std::cout << "CreateFile Failed!" << std::endl;
    	}
    
    	//获取文件大小
    	LARGE_INTEGER lpFileSize;
    	/*
    	typedef union _LARGE_INTEGER {
    		struct {
    			DWORD LowPart;
    			LONG HighPart;
    		} DUMMYSTRUCTNAME;
    		struct {
    			DWORD LowPart;
    			LONG HighPart;
    		} u;
    		LONGLONG QuadPart;
    	} LARGE_INTEGER;
    	*/
    	if (!GetFileSizeEx(hFile, &lpFileSize
    		)) {
    		std::cout << "GetFileSize Failed!" << std::endl;
    		std::cout << "错误码:" << GetLastError() << std::endl;
    	}
    
    	//定义我们要读出文件的字符串
    	CHAR* szBuffer = new CHAR[lpFileSize.LowPart + 1];
    	memset(szBuffer, 0, lpFileSize.LowPart + 1);
    
    	DWORD lpNumberOfBytesRead;
    	BOOL bRet = ReadFile(hFile,
    		szBuffer,
    		lpFileSize.LowPart,
    		&lpNumberOfBytesRead,
    		NULL
    	);
    
    	if (bRet) {
    		std::cout << szBuffer << std::endl;
    	}
    	else {
    		std::cout << "ReadFile Faild!" << std::endl;
    	}
    
    	CloseHandle(hFile);
    	system("pause");
    	return 0;
    }
    
    
  • 移动文件:

    	//移动文件
    	if (MoveFile(L"E:\\Test A\\111.txt", L"E:\\Test B\\222.txt")) {
    		std::cout << "移动成功" << std::endl;
    	}
    	else {
    		std::cout << "移动失败!" << std::endl;
    	}
    
    	//删除文件
    	if (DeleteFile(L"E:\\Test B\\222.txt")) {
    		std::cout << "删除成功" << std::endl;
    	}
    	else {
    		std::cout << "删除失败!" << std::endl;
    	}
    
    	//拷贝文件
    	if (CopyFile(L"E:\\Test B\\222 - 副本.txt", L"E:\\Test A\\111.txt", TRUE)) {
    		std::cout << "移动成功" << std::endl;
    	}
    	else {
    		std::cout << "移动失败!" << std::endl;
    	}
    
    

目录

	//创建新目录:
	CreateDirectory(L"E:\\Test C", NULL);
	//删除目录(只能删除空目录):
	RemoveDirectory(L"E:\\Test C");

	//遍历文件目录:
	WIN32_FIND_DATAW FindFileData;
	HANDLE hFile = FindFirstFile(L"E:\\*", &FindFileData);

	if (hFile == INVALID_HANDLE_VALUE) {
		std::cout << "FindFirstFile Failed" << std::endl;
	}

	do {
		//判断是否为目录:
		if (FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) {
			std::cout << "(Directory)";
		}

		std::cout << FindFileData.cFileName << ":";
		
		//处理时间:
		SYSTEMTIME Systime;
		FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
		std::cout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay << "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;


	} while (FindNextFile(hFile, &FindFileData));

.:当前路径

…:上级路径

一般如果想要遍历C盘文件,需要手动提权,或者:

属性页-连接器-清单文件,UAC执行级别:设置高级

获取单个文件详细信息

#include <iostream>
#include <windows.h>

int main(){
	//获取单个文件详细信息:
	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPWN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	BY_HANDLE_FILE_INFORMATION bhFileInfo;
	GetFileInformationByHandle(hFile, &bhFileInfo);
  std::cout<<......<<std::endl;
  system("pause");
  return 0;
}

盘符

A-Z

Z之后,挂硬盘挂不上去

A,B盘是软盘

获取磁盘类型:

UINT uRet = GetDriveType("C:");

查询磁盘相关信息:

GetVolumeInformation()

获取磁盘大小:

GetDiskFreeSpace("D:\\",...)

硬盘(卷)GUIID:

char szvolume[MAX_PATH]={0};
HANDLE hVolume = FindFirstVolume(szVolume,MAX_PATH);
std::cout<<szVolume<<std::endl;
while(FindNextVolume(hVolume,szVolume,MAX_PATH)){
  std::cout<<szVolume<<std::endl;
}
FindVolumeClostd(hVolume);

作业

  1. 自己实现拷贝文件功能(CopyFile)
    BOOL MyCopyFile(LPCWSTR Src, LPCWSTR New,BOOL nFlag)
    {
    	HANDLE hSrcFile = NULL;
    	switch (nFlag) {
    	case FALSE: {
    		hSrcFile = CreateFile(Src, GENERIC_READ, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    		if (hSrcFile == INVALID_HANDLE_VALUE) {
    			std::cout << "CreateFile Failed" << std::endl;
    			return FALSE;
    		}
    	}
    	case TRUE: {
    		hSrcFile = CreateFile(Src, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    		if (hSrcFile == INVALID_HANDLE_VALUE) {
    			std::cout << "CreateFile Failed" << std::endl;
    			return FALSE;
    		}
    	}
    	}
    
    	LARGE_INTEGER lpFileSize;
    	if (!GetFileSizeEx(hSrcFile, &lpFileSize)) {
    		std::cout << "GetFileSize Failed" << std::endl;
    		std::cout << GetLastError() << std::endl;
    		return FALSE;
    	}
    
    	CHAR* szBuffer = new CHAR[lpFileSize.LowPart + 1];
    	if (szBuffer == nullptr) {
    		std::cout << "申请内存失败!" << std::endl;
    		return FALSE;
    	}
    	memset(szBuffer, 0, lpFileSize.LowPart + 1);
    
    	DWORD lpNumberOfBytesRead;
    	BOOL bRet = ReadFile(hSrcFile, szBuffer, lpFileSize.LowPart, &lpNumberOfBytesRead, NULL);
    	if (!bRet) {
    		std::cout << "ReadFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	HANDLE hNewFile = CreateFile(New, GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hNewFile == INVALID_HANDLE_VALUE) {
    		std::cout << "CreateFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	DWORD lpNumberOfBytesWritten;
    	bRet = WriteFile(hNewFile, szBuffer, lpFileSize.LowPart, &lpNumberOfBytesWritten, NULL);
    	if (!bRet) {
    		std::cout << "WriteFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	CloseHandle(hSrcFile);
    	CloseHandle(hNewFile);
    	delete(szBuffer);
    	return TRUE;
    }
    
  2. 自己实现移动文件(MoveFile)功能
    BOOL MyMoveFile(LPCWSTR Src, LPCWSTR New)
    {
    	HANDLE hSrcFile = CreateFile(Src, GENERIC_READ, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hSrcFile == INVALID_HANDLE_VALUE) {
    		std::cout << "CreateFile Failed" << std::endl;
    		return FALSE;
    	}
    
    	LARGE_INTEGER lpFileSize;
    	if (!GetFileSizeEx(hSrcFile, &lpFileSize)) {
    		std::cout << "GetFileSize Failed" << std::endl;
    		std::cout << GetLastError() << std::endl;
    		return FALSE;
    	}
    
    	CHAR* szBuffer = new CHAR[lpFileSize.LowPart + 1];
    	if (szBuffer == nullptr) {
    		std::cout << "申请内存失败!" << std::endl;
    		return FALSE;
    	}
    	memset(szBuffer, 0, lpFileSize.LowPart + 1);
    
    	DWORD lpNumberOfBytesRead;
    	BOOL bRet = ReadFile(hSrcFile, szBuffer, lpFileSize.LowPart, &lpNumberOfBytesRead, NULL);
    	if (!bRet) {
    		std::cout << "ReadFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	HANDLE hNewFile = CreateFile(New, GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hNewFile == INVALID_HANDLE_VALUE) {
    		std::cout << "CreateFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	DWORD lpNumberOfBytesWritten;
    	bRet = WriteFile(hNewFile, szBuffer, lpFileSize.LowPart, &lpNumberOfBytesWritten, NULL);
    	if (!bRet) {
    		std::cout << "WriteFile Failed!" << std::endl;
    		return FALSE;
    	}
    
    	DeleteFile(Src);
    
    	CloseHandle(hSrcFile);
    	CloseHandle(hNewFile);
    	delete(szBuffer);
    	return TRUE;
    }
    
  3. 自己实现一个删除非空目录的函数
    void ReadDirectory(LPCWSTR lpDirectory)
    {
    	WIN32_FIND_DATAW FindFileData;
    	HANDLE hFile = FindFirstFile((std::wstring(lpDirectory) + L"\\*").c_str(), &FindFileData);
    
    	if (hFile == INVALID_HANDLE_VALUE) {
    		std::wcout << "FindFirstFile Failed" << std::endl;
    		return;
    	}
    
    	do {
    		// 判断是否为目录:
    		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
    			if (wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0) {
    				// 构建新的路径并递归调用
    				std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    				ReadDirectory(newPath.c_str());
    
    				// 在递归之后删除目录
    				RemoveDirectory(newPath.c_str());
    			}
    		}
    		else {
    			// 构建文件的完整路径
    			std::wstring filePath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    
    			// 删除文件
    			if (DeleteFile(filePath.c_str())) {
    				std::wcout << "Deleted: " << filePath << std::endl;
    			}
    			else {
    				std::wcout << "Failed to delete: " << filePath << std::endl;
    			}
    		}
    	} while (FindNextFile(hFile, &FindFileData));
    	RemoveDirectory(lpDirectory);
    	FindClose(hFile);
    }
    
  4. 自己实现递归遍历文件的函数
    void ReadDirectory(LPCWSTR lpDirectory, int nCount = 0)
    {
    	WIN32_FIND_DATAW FindFileData;
    	HANDLE hFile = FindFirstFile((std::wstring(lpDirectory) + L"\\*").c_str(), &FindFileData);
    
    	if (hFile == INVALID_HANDLE_VALUE) {
    		std::wcout << "FindFirstFile Failed" << std::endl;
    		return;
    	}
    
    	do {
    		// 判断是否为目录:
    		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
    			if (wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0) {
    				std::wcout << std::wstring(nCount, L' ') << "(Directory) ";
    				std::wcout << FindFileData.cFileName << ":";
    
    				// 处理时间:
    				SYSTEMTIME Systime;
    				FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
    				std::wcout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay
    					<< "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;
    
    				// 构建新的路径并递归调用
    				std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    				ReadDirectory(newPath.c_str(), nCount + 1);
    			}
    		}
    		else {
    			std::wcout << std::wstring(nCount, L' ');
    			std::wcout << FindFileData.cFileName << ":";
    
    			// 处理时间:
    			SYSTEMTIME Systime;
    			FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
    			std::wcout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay
    				<< "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;
    		}
    	} while (FindNextFile(hFile, &FindFileData));
    
    	FindClose(hFile);
    }
    

到了这里,关于【Windows系统编程】01.文件与目录操作-笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Windows系统自带的安全加密解密文件操作步骤详解

    原以为安全加密的方法是加密压缩包,有的需要用软件加密文件,可每次想往里面修改或存放文件都要先解密,不用时,还得去加密,操作步骤那么多,那多不方便呀,这里讲讲用系统自带的BitLocker加密工具怎么做。 原以为系统自带的 BitLocker 只能加密计算机的硬盘,那怎样

    2024年02月03日
    浏览(35)
  • Windows API编程01-详解第一个程序(超级详细)

    联系WeChat:i-xiaodi,交流,付费课程学习 简单介绍Windows API: Windows API(Application Programming Interface)是Microsoft Windows平台的应用程序编程接口,其主要目的是让应用程序开发人员可以调用操作系统提供的一组例程功能,而无须考虑其底层的源代码实现及内部工作机制。API函数是

    2024年01月21日
    浏览(27)
  • windows共享文件夹(目录)(SMB服务)

    SMB服务,文件共享服务,俗称文件夹(目录)、打印机等共享 windos系统中,文件夹共享需要设置指定用户与密码,通过输入用户和密码进行连接,在设置共享时系统中有Everyone所有人设置,允许所有人直接访问,但是访问基本不成功,所以需要指定用户与密码去进行访问,提

    2024年02月02日
    浏览(45)
  • Windows下打开指定目录并定位到具体文件

    使用 system() 函数执行操作系统的命令行命令。 在命令行命令中,使用 explorer /select, 文件路径 来打开目录并选中指定文件。例如: 使用Windows API的 ShellExecute() 函数来打开目录并选中指定文件。 使用 ShellExecute(NULL, \\\"open\\\", \\\"explorer.exe\\\", \\\"/select, 文件路径\\\", NULL, SW_SHOW); 来打开资源管

    2024年02月13日
    浏览(22)
  • Windows编程学习笔记04-Windows编程字符集

    总的来讲,由于历史和发展的原因,产生了 Unicode 和 多字节字符集(MBCS、DBCS、ANSI)。在早期,使用Unicode占用内存多,使用多字节字符集又无法国际化。所以使用 WindowsAPI 以及CC++ 进行Windows编程时有两种字符集,如一些WindowsAPI都会存在两个版本(比如 MessageBoxA 和 MessageBo

    2024年02月04日
    浏览(30)
  • windows 文件夹目录过长超过长度259字符 文件打不开

      当路径超过260个字符时,Windows操作系统就无法处理文件或文件夹,并且无法打开或重命名。这是因为Windows系统使用的文件系统,即FAT和NTFS文件系统,都有最大路径限制。NTFS文件系统最大长度限制为32767个字符,但操作系统和应用程序默认的限制是260个字符。这是由于历史

    2024年02月07日
    浏览(34)
  • VSCode修改扩展和用户文件夹目录位置(Windows)

    vscode 的扩展和用户数据都是默认在C盘下的 extensions : C:Users.vscodeextensions user-data : C:UsersAppDataRoamingCode 一般来说,用户文件夹大小会比扩展目录的大小会大,就我而言,我的扩展有 1-1.5GB 的大小,而用户文件夹却占了我 5GB 容量,这对 C 盘容量严重不足的用户是非常难受的

    2023年04月08日
    浏览(70)
  • keychron K3 键盘和 Windows11 操作系统的笔记本电脑通过蓝牙配对出现问题的解决方案

    最近一直使用良好的 keychron k3 键盘,忽然出现了一些问题。 我用的是 Windows11 操作系统。keychron k3 采用蓝牙模式连接。能够成功配对,但 Connected 状态只能持续1秒钟,随即就变成了 Paired 状态。 下图是短暂的1秒钟能够成功连接的状态: 同这台笔记本电脑连接的其他蓝牙设备

    2024年02月09日
    浏览(50)
  • Windows11 22H2 系统版本 系统部分目录进行迁移

    首先一定是新装的系统,然后使用Administrator账户,因为此账户可以有更多的权限,对系统做出更改,此次修改有弊端,修改完成后,appx文件无法安装,MicrosoftWindowsStore无法安装和更新,如果有解决方案,请反馈,谢谢 所以,第一步就是切换账户,右键Windows,选择计算机管理本地用户和组用户

    2024年02月19日
    浏览(33)
  • [笔记]Windows核心编程《十九》DLL基础

    [笔记]Windows核心编程《一》错误处理、字符编码 [笔记]Windows核心编程《二》内核对象 [笔记]Windows核心编程《三》进程 [笔记]Windows核心编程《四》作业 [笔记]快乐的LInux命令行《五》什么是shell [笔记]Windows核心编程《五》线程基础 [笔记]Windows核心编程《六》线程调度、优先级

    2024年02月04日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包