本專欄從這篇文章開始做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()
獲取磁盤大小:文章來源:http://www.zghlxwxcb.cn/news/detail-645855.html
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è)
- 自己實(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; }
- 自己實(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; }
- 自己實(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); }
- 自己實(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); }
- 遍歷某一個(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è)
- 自己實(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; }
- 自己實(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; }
- 自己實(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); }
- 自己實(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)!