1. 程式人生 > >C語言遍歷檔案

C語言遍歷檔案

原文:https://www.cnblogs.com/collectionne/p/6815924.html

程式程式碼

  1. 遍歷目錄下的所有檔案
#include <iostream>
#include <cstring>        // for strcat()
#include <io.h>
using namespace std;

void listFiles(const char * dir);

int main()
{
    char dir[200];
    cout << "Enter a directory (ends with \'\\\'): "
; cin.getline(dir, 200); strcat(dir, "*.*"); // 在要遍歷的目錄後加上萬用字元 listFiles(dir); return 0; } void listFiles(const char * dir) { intptr_t handle; _finddata_t findData; handle = _findfirst(dir, &findData); // 查詢目錄中的第一個檔案 if (handle == -1) { cout << "Failed to find first file!\n"
; return; } do { if (findData.attrib & _A_SUBDIR && strcmp(findData.name, ".") == 0 && strcmp(findData.name, "..") == 0 ) // 是否是子目錄並且不為"."或".." cout << findData.name << "\t<dir>\n"; else
cout << findData.name << "\t" << findData.size << endl; } while (_findnext(handle, &findData) == 0); // 查詢目錄中的下一個檔案 cout << "Done!\n"; _findclose(handle); // 關閉搜尋控制代碼 }

程式遍歷目錄下的所有檔案/目錄,如果是檔案則輸出檔案大小。

注意_findnext()函式成功返回0,因此要加上==0或!=-1進行判斷,不能省略。

此外還有一個值得注意的地方:

if (findData.attrib & _A_SUBDIR
    && strcmp(findData.name, ".")
    && strcmp(findData.name, "..")
)

使用_findfirst()、_findnext()進行搜尋時,可能會得到”.”和”..”兩個資料夾名。這兩個值可以忽略。

遍歷目錄中的所有檔案

注意是“目錄中”而不是“目錄下”,這個程式將會遍歷一個目錄裡包含的所有檔案。

#include <iostream>
#include <cstring>        // for strcpy(), strcat()
#include <io.h>

using namespace std;

void listFiles(const char * dir);

int main()
{
    char dir[200];
    cout << "Enter a directory: ";
    cin.getline(dir, 200);

    listFiles(dir);

    return 0;
}

void listFiles(const char * dir)
{
    char dirNew[200];
    strcpy(dirNew, dir);
    strcat(dirNew, "\\*.*");    // 在目錄後面加上"\\*.*"進行第一次搜尋

    intptr_t handle;
    _finddata_t findData;

    handle = _findfirst(dirNew, &findData);
    if (handle == -1)        // 檢查是否成功
        return;

    do
    {
        if (findData.attrib & _A_SUBDIR)
        {
            if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)
                continue;

            cout << findData.name << "\t<dir>\n";

            // 在目錄後面加上"\\"和搜尋到的目錄名進行下一次搜尋
            strcpy(dirNew, dir);
            strcat(dirNew, "\\");
            strcat(dirNew, findData.name);

            listFiles(dirNew);
        }
        else
            cout << findData.name << "\t" << findData.size << " bytes.\n";
    } while (_findnext(handle, &findData) == 0);

    _findclose(handle);    // 關閉搜尋控制代碼
}