文件,讓人又愛又恨;
主要是講操作
首先,我們看一下,文件的操作部分的第一個(gè)部分,
文件信息結(jié)構(gòu)體:WIN32_FIND_DATAA
這是VS2019下查看定義
typedef struct _WIN32_FIND_DATAA {
? ? DWORD dwFileAttributes;? ? ? ? ? ?//文件屬性
? ? FILETIME ftCreationTime;? ? ? ? ? ?//文件創(chuàng)建時(shí)間
? ? FILETIME ftLastAccessTime;? ? ? ?//文件最后一次訪問時(shí)間
? ? FILETIME ftLastWriteTime;? ? ? ? ? //文件最后一次寫入時(shí)間
? ? DWORD nFileSizeHigh;
? ? DWORD nFileSizeLow;
? ? DWORD dwReserved0;
? ? DWORD dwReserved1;
? ? _Field_z_ CHAR? cFileName[ MAX_PATH ];
? ? _Field_z_ CHAR? cAlternateFileName[ 14 ];
#ifdef _MAC
? ? DWORD dwFileType;
? ? DWORD dwCreatorType;
? ? WORD? wFinderFlags;
#endif
} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
查找第一個(gè)文件與查找下一個(gè)文件
查看定義,F(xiàn)indFirstFileA 與 FindNextFileA
返回值INVALID_HANDLE_VALUE(無(wú)效句柄值)
HANDLE WINAPI?FindFirstFileA( _In_ LPCSTR lpFileName,?
? ? ? ? ? ? ? ? ? ? ? ? ?_Out_ LPWIN32_FIND_DATAA lpFindFileData );
返回值布爾值
BOOL WINAPI FindNextFileA( _In_ HANDLE hFindFile,?
? ? ? ? ? ? ? ? ? ? ? ? ? _Out_ LPWIN32_FIND_DATAA lpFindFileData );
我們可以遍歷文件信息,可以查看文件,就可以做很多事情了
編譯環(huán)境,VS2019,使用字符集unicode,當(dāng)然多字節(jié)字符集也是可以的
實(shí)現(xiàn)文件遍歷
#include <iostream>
#include <windows.h>
#include <string>
#define maxx 1000
//參數(shù)文件路徑或者盤符
int findFile(char* Path)
{
char fd[maxx];
LPWIN32_FIND_DATAA FindFileData = new WIN32_FIND_DATAA;
strcpy_s(fd, Path);
strcat_s(fd, "\\*.*");
HANDLE hFind = FindFirstFileA(fd, FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
if (FindFileData != NULL) {
delete FindFileData;
FindFileData = NULL;
}
return -1;
}
//文件句柄
while (FindNextFileA(hFind, FindFileData))
{
if (FindFileData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (strcmp(FindFileData->cFileName, ".") != 0 && strcmp(FindFileData->cFileName, "..") != 0)
{
//這里可以顯示文件夾(可以把文件夾保存)
//std::cout <<"這是文件夾:"<< FindFileData.cFileName << std::endl;
char szFile[maxx] = { 0 };
strcpy_s(szFile, Path);
strcat_s(szFile, "\\");
strcat_s(szFile, FindFileData->cFileName);
findFile(szFile);
//std::cout << "以上是文件夾:" << FindFileData.cFileName << std::endl;
}
}
else
{
//打印文件路徑
std::cout << Path << "\\" << FindFileData->cFileName << std::endl;
}
}
FindClose(hFind);
if (FindFileData != NULL) {
delete FindFileData;
FindFileData = NULL;
}
return 0;
}
int main()
{
std::string temp;
char* path = NULL;
std::cout << "請(qǐng)輸入文件夾名字或者盤符" << std::endl;
std::cout << "示例一:d:" << std::endl;
std::cout << "示例二:e:\\444" << std::endl;
std::cout << "請(qǐng)輸入:";
std::cin >> temp;
path = (char*)temp.c_str();
findFile(path);
system("pause");
return 0;
}
效果如下:

遍歷自己的盤符之后,可以考慮遍歷所有的盤符,接下來(lái)要講的就是邏輯盤的操作
主要是一個(gè)函數(shù),查看定義:
DWORD
WINAPI
GetLogicalDriveStringsA(
? ? _In_ DWORD nBufferLength,? ? ? ? ?//緩沖區(qū)長(zhǎng)度
? ? _Out_writes_to_opt_(nBufferLength, return + 1) LPSTR lpBuffer? //緩沖區(qū)
? ? );
小貼士:1、dword 類型就是無(wú)符號(hào)長(zhǎng)整形 即 unsigned long
? ? ? ? ? ? ? 2、可以理解為擠牙膏似的存儲(chǔ),雖然連續(xù),但是輸出是一段一段的,即緩沖區(qū)地址雖然連續(xù),但是輸出的盤符是一個(gè)一個(gè)的
//具體可自行想象內(nèi)存結(jié)構(gòu)個(gè)人理解示意圖

#include <stdio.h>
#include<iostream>
#include <Windows.h>
int main()
{
DWORD dwSize = MAX_PATH;
char logicalDrive[MAX_PATH] = { 0 };
DWORD dwResult = GetLogicalDriveStringsA(dwSize, logicalDrive);
//處理獲取到的結(jié)果
if (dwResult > 0 && dwResult <= MAX_PATH) {
//找到第一個(gè)磁盤的首地址
char* szSingleDrive = logicalDrive;
while (*szSingleDrive) {
std::cout << szSingleDrive << std::endl;
// 獲取下一個(gè)磁盤的首地址
szSingleDrive += strlen(szSingleDrive) + 1;
}
}
return 0;
}

得到磁盤,再結(jié)合磁盤遍歷,可以做些什么呢?一切盡在你自己掌握
2019/9/9 17:52:32