在進行文件操作時,我們常常需要搜索並展示當前目錄下的文件列表。而Windows SDK提供了一個非常方便的函數——findfirstfile,它可以幫助我們完成這個任務。在本文中,我們將從多個方面對使用findfirstfile函數進行文件搜索和展示做出詳細的闡述。
一、文件搜索基礎
在開始介紹findfirstfile函數之前,我們先來了解一下文件搜索的基礎原理。在Windows操作系統中,每個目錄下都有一個目錄文件,我們通常把它叫做「.(點)」文件。這個文件包含了當前目錄下所有文件的信息,我們可以通過訪問這個文件來獲取當前目錄下的文件列表。在Windows中,這個」.(點)」文件的名稱是「*.*」,它代表了當前目錄下的所有文件類型。
二、使用findfirstfile函數進行搜索
findfirstfile函數是Windows SDK提供的一個非常方便的函數,它可以用來搜索指定目錄下的文件並返回它們的信息,包括文件名、文件大小、文件創建時間等等。下面是一個使用findfirstfile函數搜索並展示文件列表的示例:
#include <windows.h>
#include <stdio.h>
void ListFiles(char *path)
{
WIN32_FIND_DATAA findData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char folderPath[MAX_PATH];
if(strlen(path) > (MAX_PATH - 3))
return;
strcpy(folderPath, path);
strcat(folderPath, "\\*");
hFind = FindFirstFileA(folderPath, &findData);
if(hFind == INVALID_HANDLE_VALUE)
{
printf("Failed to find file: %s.\n", path);
return;
}
do
{
printf("%s\n", findData.cFileName);
}while(FindNextFileA(hFind, &findData));
FindClose(hFind);
}
int main()
{
char *path = "C:\\test";
ListFiles(path);
return 0;
}
在這個示例中,我們定義了一個ListFiles函數,這個函數接受一個路徑參數,並使用findfirstfile函數來搜索並展示該路徑下的所有文件。在函數中,我們先構造了一個表示路徑的字元串並拼接了一個「*」字元,獲得了搜索該路徑下所有文件的表達式,然後調用findfirstfile來搜索所有符合表達式的文件並依次展示文件名。
三、搜索特定類型的文件
除了「*.*」之外,我們也可以使用findfirstfile函數來搜索指定類型的文件,例如搜索所有的jpg圖片文件。要實現這個功能,我們只需將文件類型添加到表達式中即可。下面是一個示例代碼:
#include <windows.h>
#include <stdio.h>
void ListFiles(char *path, char *fileExt)
{
char folderPath[MAX_PATH];
sprintf(folderPath, "%s\\*.%s", path, fileExt);
WIN32_FIND_DATAA findData;
HANDLE hFind = FindFirstFileA(folderPath, &findData);
if(hFind == INVALID_HANDLE_VALUE)
{
printf("Failed to find file: %s.\n", path);
return;
}
do
{
printf("%s\n", findData.cFileName);
}while(FindNextFileA(hFind, &findData));
FindClose(hFind);
}
int main()
{
char *path = "C:\\test";
char *fileExt = "jpg";
ListFiles(path, fileExt);
return 0;
}
在這個示例中,我們增加了一個字元串參數來表示需要搜索的文件類型。我們通過sprintf函數將路徑和文件類型拼接為一個字元串,並傳遞給findfirstfile函數進行搜索。
四、使用遞歸方式搜索文件
有時候,我們需要搜索一個目錄的所有子目錄中的文件以及本身所在目錄中的文件。這時候,我們可以遞歸調用findfirstfile函數來實現這個功能。下面是一個示例代碼:
#include <windows.h>
#include <stdio.h>
void ListFiles(char *path)
{
WIN32_FIND_DATAA findData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char folderPath[MAX_PATH];
if(strlen(path) > (MAX_PATH - 3))
return;
strcpy(folderPath, path);
strcat(folderPath, "\\*");
hFind = FindFirstFileA(folderPath, &findData);
if(hFind == INVALID_HANDLE_VALUE)
{
printf("Failed to find file: %s.\n", path);
return;
}
do
{
if(strcmp(findData.cFileName, "..") == 0 || strcmp(findData.cFileName, ".") == 0)
continue;
if((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
char subPath[MAX_PATH];
sprintf(subPath, "%s\\%s", path, findData.cFileName);
ListFiles(subPath);
}
else
{
printf("%s\\%s\n", path, findData.cFileName);
}
}while(FindNextFileA(hFind, &findData));
FindClose(hFind);
}
int main()
{
char *path = "C:\\test";
ListFiles(path);
return 0;
}
在這個示例中,我們使用了遞歸的方式來實現對目錄和子目錄的搜索。當我們遇到一個目錄時,我們先遞歸調用ListFiles函數來搜索該目錄下的所有文件,然後回到上一級目錄,繼續搜索其他目錄或文件。當我們遇到一個文件時,我們直接輸出其路徑和文件名。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/293067.html