国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【W(wǎng)indows系統(tǒng)編程】01.文件與目錄操作-筆記

這篇具有很好參考價(jià)值的文章主要介紹了【W(wǎng)indows系統(tǒng)編程】01.文件與目錄操作-筆記。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本專欄從這篇文章開始做Windows系統(tǒng)編程的筆記,本章主要講解:Windows文件操作(讀寫文件,刪除文件,拷貝文件,移動(dòng)文件等),目錄操作(遍歷目錄,刪除目錄等)硬盤的一點(diǎn)小知識(shí)。
參考書:Windows核心編程

文件,內(nèi)核對(duì)象

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

int main()
{
	//打開文件或I/O設(shè)備
	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt",   //文件名
		GENERIC_READ | GENERIC_WRITE,                   //打開方式
		NULL,                                           //共享模式,這里NULL是獨(dú)占
		NULL,                                           //安全屬性
		OPEN_ALWAYS,                                    //要對(duì)存在或不存在的文件或設(shè)備進(jìn)行的操作
		FILE_ATTRIBUTE_NORMAL,                          //文件或設(shè)備屬性
		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;
}

上述的是沒有錯(cuò)誤的操作流程

如果文件已經(jīng)存在的話,就會(huì)出現(xiàn)錯(cuò)誤

我們?cè)陂_發(fā)過程中,如何定位錯(cuò)誤?

監(jiān)視->添加監(jiān)視:err,hr

這樣,如果出現(xiàn)錯(cuò)誤,錯(cuò)誤原因也就會(huì)顯示了

或者,復(fù)制錯(cuò)誤碼,在工具:錯(cuò)誤查找中,查找錯(cuò)誤原因

或者:

std::cout<<GetLaseError()<<std::endl;
這樣會(huì)直接打印出錯(cuò)誤碼
  • 讀文件:

    #include <iostream>
    #include <Windows.h>
    
    int main()
    {
    	//打開文件或I/O設(shè)備
    	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt",   //文件名
    		GENERIC_READ | GENERIC_WRITE,                   //打開方式
    		NULL,                                           //共享模式,這里NULL是獨(dú)占
    		NULL,                                           //安全屬性
    		OPEN_ALWAYS,                                    //要對(duì)存在或不存在的文件或設(shè)備進(jìn)行的操作
    		FILE_ATTRIBUTE_NORMAL,                          //文件或設(shè)備屬性
    		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 << "錯(cuò)誤碼:" << 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;
    }
    
    
  • 移動(dòng)文件:

    	//移動(dòng)文件
    	if (MoveFile(L"E:\\Test A\\111.txt", L"E:\\Test B\\222.txt")) {
    		std::cout << "移動(dòng)成功" << std::endl;
    	}
    	else {
    		std::cout << "移動(dòng)失??!" << 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 << "移動(dòng)成功" << std::endl;
    	}
    	else {
    		std::cout << "移動(dòng)失敗!" << std::endl;
    	}
    
    

目錄

	//創(chuàng)建新目錄:
	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 << ":";
		
		//處理時(shí)間:
		SYSTEMTIME Systime;
		FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
		std::cout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay << "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;


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

.:當(dāng)前路徑

…:上級(jí)路徑

一般如果想要遍歷C盤文件,需要手動(dòng)提權(quán),或者:

屬性頁-連接器-清單文件,UAC執(zhí)行級(jí)別:設(shè)置高級(jí)

獲取單個(gè)文件詳細(xì)信息

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

int main(){
	//獲取單個(gè)文件詳細(xì)信息:
	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:");

查詢磁盤相關(guān)信息:

GetVolumeInformation()

獲取磁盤大小:

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

硬盤(卷)GUIID:文章來源地址http://www.zghlxwxcb.cn/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);

作業(yè)

  1. 自己實(shí)現(xiàn)拷貝文件功能(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 << "申請(qǐng)內(nèi)存失??!" << 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. 自己實(shí)現(xiàn)移動(dòng)文件(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 << "申請(qǐng)內(nèi)存失??!" << 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. 自己實(shí)現(xiàn)一個(gè)刪除非空目錄的函數(shù)
    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) {
    				// 構(gòu)建新的路徑并遞歸調(diào)用
    				std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    				ReadDirectory(newPath.c_str());
    
    				// 在遞歸之后刪除目錄
    				RemoveDirectory(newPath.c_str());
    			}
    		}
    		else {
    			// 構(gòu)建文件的完整路徑
    			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. 自己實(shí)現(xiàn)遞歸遍歷文件的函數(shù)
    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 << ":";
    
    				// 處理時(shí)間:
    				SYSTEMTIME Systime;
    				FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
    				std::wcout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay
    					<< "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;
    
    				// 構(gòu)建新的路徑并遞歸調(diào)用
    				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 << ":";
    
    			// 處理時(shí)間:
    			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. 遍歷某一個(gè)文件夾的文件后,對(duì)其加密(異或)(虛擬機(jī)實(shí)驗(yàn))
    // 加密文件夾.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
    //
    
    #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) {
    				// 構(gòu)建新的路徑并遞歸調(diào)用
    				std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    				EncipherFile(newPath.c_str());
    			}
    		}
    		else {
    			// 構(gòu)建文件的完整路徑
    			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';
    	}
    
    	//移動(dòng)文件指針
    	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
  //相互轉(zhuǎn)換:
  Windows API都有版本: A W EX
  ASCII UNICODE 拓展版本
  
  MessageBox()
  
  system("pause");
  return 0;
}

文件,內(nèi)核對(duì)象

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

int main()
{
	//打開文件或I/O設(shè)備
	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt",   //文件名
		GENERIC_READ | GENERIC_WRITE,                   //打開方式
		NULL,                                           //共享模式,這里NULL是獨(dú)占
		NULL,                                           //安全屬性
		OPEN_ALWAYS,                                    //要對(duì)存在或不存在的文件或設(shè)備進(jìn)行的操作
		FILE_ATTRIBUTE_NORMAL,                          //文件或設(shè)備屬性
		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;
}

上述的是沒有錯(cuò)誤的操作流程

如果文件已經(jīng)存在的話,就會(huì)出現(xiàn)錯(cuò)誤

我們?cè)陂_發(fā)過程中,如何定位錯(cuò)誤?

監(jiān)視->添加監(jiān)視:err,hr

這樣,如果出現(xiàn)錯(cuò)誤,錯(cuò)誤原因也就會(huì)顯示了

或者,復(fù)制錯(cuò)誤碼,在工具:錯(cuò)誤查找中,查找錯(cuò)誤原因

或者:

std::cout<<GetLaseError()<<std::endl;
這樣會(huì)直接打印出錯(cuò)誤碼
  • 讀文件:

    #include <iostream>
    #include <Windows.h>
    
    int main()
    {
    	//打開文件或I/O設(shè)備
    	HANDLE hFile = CreateFile(L"E:\\Test A\\111.txt",   //文件名
    		GENERIC_READ | GENERIC_WRITE,                   //打開方式
    		NULL,                                           //共享模式,這里NULL是獨(dú)占
    		NULL,                                           //安全屬性
    		OPEN_ALWAYS,                                    //要對(duì)存在或不存在的文件或設(shè)備進(jìn)行的操作
    		FILE_ATTRIBUTE_NORMAL,                          //文件或設(shè)備屬性
    		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 << "錯(cuò)誤碼:" << 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;
    }
    
    
  • 移動(dòng)文件:

    	//移動(dòng)文件
    	if (MoveFile(L"E:\\Test A\\111.txt", L"E:\\Test B\\222.txt")) {
    		std::cout << "移動(dòng)成功" << std::endl;
    	}
    	else {
    		std::cout << "移動(dòng)失?。? << 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 << "移動(dòng)成功" << std::endl;
    	}
    	else {
    		std::cout << "移動(dòng)失??!" << std::endl;
    	}
    
    

目錄

	//創(chuàng)建新目錄:
	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 << ":";
		
		//處理時(shí)間:
		SYSTEMTIME Systime;
		FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
		std::cout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay << "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;


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

.:當(dāng)前路徑

…:上級(jí)路徑

一般如果想要遍歷C盤文件,需要手動(dòng)提權(quán),或者:

屬性頁-連接器-清單文件,UAC執(zhí)行級(jí)別:設(shè)置高級(jí)

獲取單個(gè)文件詳細(xì)信息

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

int main(){
	//獲取單個(gè)文件詳細(xì)信息:
	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:");

查詢磁盤相關(guān)信息:

GetVolumeInformation()

獲取磁盤大?。?/p>

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);

作業(yè)

  1. 自己實(shí)現(xiàn)拷貝文件功能(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 << "申請(qǐng)內(nèi)存失??!" << 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. 自己實(shí)現(xiàn)移動(dòng)文件(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 << "申請(qǐng)內(nèi)存失?。? << 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. 自己實(shí)現(xiàn)一個(gè)刪除非空目錄的函數(shù)
    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) {
    				// 構(gòu)建新的路徑并遞歸調(diào)用
    				std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
    				ReadDirectory(newPath.c_str());
    
    				// 在遞歸之后刪除目錄
    				RemoveDirectory(newPath.c_str());
    			}
    		}
    		else {
    			// 構(gòu)建文件的完整路徑
    			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. 自己實(shí)現(xiàn)遞歸遍歷文件的函數(shù)
    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 << ":";
    
    				// 處理時(shí)間:
    				SYSTEMTIME Systime;
    				FileTimeToSystemTime(&FindFileData.ftCreationTime, &Systime);
    				std::wcout << Systime.wYear << "-" << Systime.wMonth << "-" << Systime.wDay
    					<< "-" << Systime.wHour << "-" << Systime.wMinute << std::endl;
    
    				// 構(gòu)建新的路徑并遞歸調(diào)用
    				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 << ":";
    
    			// 處理時(shí)間:
    			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);
    }
    

到了這里,關(guān)于【W(wǎng)indows系統(tǒng)編程】01.文件與目錄操作-筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用Windows系統(tǒng)自帶的安全加密解密文件操作步驟詳解

    使用Windows系統(tǒng)自帶的安全加密解密文件操作步驟詳解

    原以為安全加密的方法是加密壓縮包,有的需要用軟件加密文件,可每次想往里面修改或存放文件都要先解密,不用時(shí),還得去加密,操作步驟那么多,那多不方便呀,這里講講用系統(tǒng)自帶的BitLocker加密工具怎么做。 原以為系統(tǒng)自帶的 BitLocker 只能加密計(jì)算機(jī)的硬盤,那怎樣

    2024年02月03日
    瀏覽(25)
  • Windows API編程01-詳解第一個(gè)程序(超級(jí)詳細(xì))

    Windows API編程01-詳解第一個(gè)程序(超級(jí)詳細(xì))

    聯(lián)系WeChat:i-xiaodi,交流,付費(fèi)課程學(xué)習(xí) 簡單介紹Windows API: Windows API(Application Programming Interface)是Microsoft Windows平臺(tái)的應(yīng)用程序編程接口,其主要目的是讓應(yīng)用程序開發(fā)人員可以調(diào)用操作系統(tǒng)提供的一組例程功能,而無須考慮其底層的源代碼實(shí)現(xiàn)及內(nèi)部工作機(jī)制。API函數(shù)是

    2024年01月21日
    瀏覽(22)
  • windows共享文件夾(目錄)(SMB服務(wù))

    windows共享文件夾(目錄)(SMB服務(wù))

    SMB服務(wù),文件共享服務(wù),俗稱文件夾(目錄)、打印機(jī)等共享 windos系統(tǒng)中,文件夾共享需要設(shè)置指定用戶與密碼,通過輸入用戶和密碼進(jìn)行連接,在設(shè)置共享時(shí)系統(tǒng)中有Everyone所有人設(shè)置,允許所有人直接訪問,但是訪問基本不成功,所以需要指定用戶與密碼去進(jìn)行訪問,提

    2024年02月02日
    瀏覽(28)
  • Windows下打開指定目錄并定位到具體文件

    使用 system() 函數(shù)執(zhí)行操作系統(tǒng)的命令行命令。 在命令行命令中,使用 explorer /select, 文件路徑 來打開目錄并選中指定文件。例如: 使用Windows API的 ShellExecute() 函數(shù)來打開目錄并選中指定文件。 使用 ShellExecute(NULL, \\\"open\\\", \\\"explorer.exe\\\", \\\"/select, 文件路徑\\\", NULL, SW_SHOW); 來打開資源管

    2024年02月13日
    瀏覽(18)
  • Windows編程學(xué)習(xí)筆記04-Windows編程字符集

    Windows編程學(xué)習(xí)筆記04-Windows編程字符集

    總的來講,由于歷史和發(fā)展的原因,產(chǎn)生了 Unicode 和 多字節(jié)字符集(MBCS、DBCS、ANSI)。在早期,使用Unicode占用內(nèi)存多,使用多字節(jié)字符集又無法國際化。所以使用 WindowsAPI 以及CC++ 進(jìn)行Windows編程時(shí)有兩種字符集,如一些WindowsAPI都會(huì)存在兩個(gè)版本(比如 MessageBoxA 和 MessageBo

    2024年02月04日
    瀏覽(21)
  • windows 文件夾目錄過長超過長度259字符 文件打不開

    windows 文件夾目錄過長超過長度259字符 文件打不開

    ? 當(dāng)路徑超過260個(gè)字符時(shí),Windows操作系統(tǒng)就無法處理文件或文件夾,并且無法打開或重命名。這是因?yàn)閃indows系統(tǒng)使用的文件系統(tǒng),即FAT和NTFS文件系統(tǒng),都有最大路徑限制。NTFS文件系統(tǒng)最大長度限制為32767個(gè)字符,但操作系統(tǒng)和應(yīng)用程序默認(rèn)的限制是260個(gè)字符。這是由于歷史

    2024年02月07日
    瀏覽(19)
  • VSCode修改擴(kuò)展和用戶文件夾目錄位置(Windows)

    VSCode修改擴(kuò)展和用戶文件夾目錄位置(Windows)

    vscode 的擴(kuò)展和用戶數(shù)據(jù)都是默認(rèn)在C盤下的 extensions : C:Users.vscodeextensions user-data : C:UsersAppDataRoamingCode 一般來說,用戶文件夾大小會(huì)比擴(kuò)展目錄的大小會(huì)大,就我而言,我的擴(kuò)展有 1-1.5GB 的大小,而用戶文件夾卻占了我 5GB 容量,這對(duì) C 盤容量嚴(yán)重不足的用戶是非常難受的

    2023年04月08日
    瀏覽(40)
  • keychron K3 鍵盤和 Windows11 操作系統(tǒng)的筆記本電腦通過藍(lán)牙配對(duì)出現(xiàn)問題的解決方案

    keychron K3 鍵盤和 Windows11 操作系統(tǒng)的筆記本電腦通過藍(lán)牙配對(duì)出現(xiàn)問題的解決方案

    最近一直使用良好的 keychron k3 鍵盤,忽然出現(xiàn)了一些問題。 我用的是 Windows11 操作系統(tǒng)。keychron k3 采用藍(lán)牙模式連接。能夠成功配對(duì),但 Connected 狀態(tài)只能持續(xù)1秒鐘,隨即就變成了 Paired 狀態(tài)。 下圖是短暫的1秒鐘能夠成功連接的狀態(tài): 同這臺(tái)筆記本電腦連接的其他藍(lán)牙設(shè)備

    2024年02月09日
    瀏覽(83)
  • Windows11 22H2 系統(tǒng)版本 系統(tǒng)部分目錄進(jìn)行遷移

    Windows11 22H2 系統(tǒng)版本 系統(tǒng)部分目錄進(jìn)行遷移

    首先一定是新裝的系統(tǒng),然后使用Administrator賬戶,因?yàn)榇速~戶可以有更多的權(quán)限,對(duì)系統(tǒng)做出更改,此次修改有弊端,修改完成后,appx文件無法安裝,MicrosoftWindowsStore無法安裝和更新,如果有解決方案,請(qǐng)反饋,謝謝 所以,第一步就是切換賬戶,右鍵Windows,選擇計(jì)算機(jī)管理本地用戶和組用戶

    2024年02月19日
    瀏覽(31)
  • [筆記]Windows核心編程《十九》DLL基礎(chǔ)

    [筆記]Windows核心編程《十九》DLL基礎(chǔ)

    [筆記]Windows核心編程《一》錯(cuò)誤處理、字符編碼 [筆記]Windows核心編程《二》內(nèi)核對(duì)象 [筆記]Windows核心編程《三》進(jìn)程 [筆記]Windows核心編程《四》作業(yè) [筆記]快樂的LInux命令行《五》什么是shell [筆記]Windows核心編程《五》線程基礎(chǔ) [筆記]Windows核心編程《六》線程調(diào)度、優(yōu)先級(jí)

    2024年02月04日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包