windows下的文件操作高級(jí)之文件遍歷

文件,讓人又愛又恨;

主要是講操作

首先,我們看一下,文件的操作部分的第一個(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;

}

效果如下:


遍歷磁盤d

遍歷自己的盤符之后,可以考慮遍歷所有的盤符,接下來(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è)人理解示意圖


結(jié)合下面程序查看

#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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容