一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++編程使用findfirst和findnext查找及遍歷文件實現示例

C++編程使用findfirst和findnext查找及遍歷文件實現示例

2022-01-24 14:07ranjiewen C/C++

這篇文章主要為大家介紹了C++編程如何使用findfirst和findnext查找及遍歷文件實現示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助

這兩個函數均在io.h里面

一、首先了解一下一個文件結構體:

?
1
2
3
4
5
6
7
8
struct _finddata_t {
    unsigned    attrib;
    time_t      time_create;  
    time_t      time_access;  
    time_t      time_write;
    _fsize_t    size;
    char        name[260];
};

time_t,其實就是long

而_fsize_t,就是unsigned long

現在來解釋一下結構體的數據成員吧。

attrib,就是所查找文件的屬性:

_A_ARCH(存檔)、_A_HIDDEN(隱藏)、_A_NORMAL(正常)、

_A_RDONLY(只讀)、 _A_SUBDIR(文件夾)、_A_SYSTEM(系統)。

time_create、time_access和time_write分別是創建文件的時間、最后一次訪問文件的時間和文件最后被修改的時間。

size:文件大小

name:文件名。

二、用 _findfirst 和 _findnext 查找文件

1、_findfirst函數:long _findfirst(const char *, struct _finddata_t *);

第一個參數為文件名,可以用"*.*"來查找所有文件,也可以用"*.cpp"來查找.cpp文件。第二個參數是_finddata_t結構體指針。若查找成功,返回文件句柄,若失敗,返回-1。

2、_findnext函數:int _findnext(long, struct _finddata_t *);

第一個參數為文件句柄,第二個參數同樣為_finddata_t結構體指針。若查找成功,返回0,失敗返回-1。

3、_findclose()函數:int _findclose(long);

只有一個參數,文件句柄。若關閉成功返回0,失敗返回-1。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <io.h>
#include <iostream>
#include <fstream>
using namespace std;
bool transfer(string fileName, int exeNum );
void dfsFolder(string folderPath, ofstream &fout);
int main()
{
    _finddata_t file;
    int k;
    long HANDLE;
    k = HANDLE = _findfirst("*.*", &file);
    while (k != -1)
    {
        cout << file.name << endl;
        k = _findnext(HANDLE, &file);
    }
    _findclose(HANDLE);
 
    transfer("C:\\Windows\\*.exe", 0);
    ofstream o_fstream;
 
    dfsFolder("E:\\\WHU\\Study", o_fstream);
    return 0;
}
//_findfirst 函數返回的是匹配到文件的句柄,數據類型為long。
//遍歷過程可以指定文件類型,這通過FileName的賦值來實現,例如要遍歷C : \WINDOWS下的所有.exe文件
bool transfer(string fileName , int exeNum)
{
    _finddata_t fileInfo;
    long handle = _findfirst(fileName.c_str(), &fileInfo);
 
    if (handle == -1L)
    {
        cerr << "failed to transfer files" << endl;
        return false;
    }
 
    do
    {
        exeNum++;
        cout << fileInfo.name << endl;
    } while (_findnext(handle, &fileInfo) == 0);
    cout << " .exe files' number:  " << exeNum << endl;
 
    return true;
}
 
//遍歷文件夾及其子文件夾下所有文件。操作系統中文件夾目錄是樹狀結構,使用深度搜索策略遍歷所有文件。用到_A_SUBDIR屬性
//在判斷有無子目錄的if分支中,由于系統在進入一個子目錄時,匹配到的頭兩個文件(夾)是"."(當前目錄),".."(上一層目錄)。
//需要忽略掉這兩種情況。當需要對遍歷到的文件做處理時,在else分支中添加相應的代碼就好
void dfsFolder(string folderPath, ofstream &fout)
{
    _finddata_t FileInfo;
    string strfind = folderPath + "\\*";
    long Handle = _findfirst(strfind.c_str(), &FileInfo);
 
    if (Handle == -1L)
    {
        cerr << "can not match the folder path" << endl;
        exit(-1);
    }
    do{
        //判斷是否有子目錄 
        if (FileInfo.attrib & _A_SUBDIR)
        {
            //這個語句很重要 
            if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
            {
                string newPath = folderPath + "\\" + FileInfo.name;
                dfsFolder(newPath, fout);
            }
        }
        else
        {
            fout<<folderPath.c_str() << "\\" << FileInfo.name << " ";
            cout << folderPath.c_str() << "\\" << FileInfo.name << endl;
        }
    } while (_findnext(Handle, &FileInfo) == 0);
 
    _findclose(Handle);
    fout.close();
}
//#include <iostream>   
//#include <string>   
//#include <io.h>   
//using namespace std;
//
//int main()
//{
//    _finddata_t file;
//    long longf;
//    string tempName;
//    //_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)   
//    if ((longf = _findfirst("E:\\WHU\\Study\\*.*", &file)) == -1l)
//    {
//        cout << "文件沒有找到!\n";
//        return 0;
//    }
//    do
//    {
//        cout << "文件列表:\n";
//        tempName = file.name;
//        if (tempName[0] == '.')
//            continue;
//        cout << file.name<<endl;
//
//        if (file.attrib == _A_NORMAL)
//        {
//            cout << "  普通文件  ";
//        }
//        else if (file.attrib == _A_RDONLY)
//        {
//            cout << "  只讀文件  ";
//        }
//        else if (file.attrib == _A_HIDDEN)
//        {
//            cout << "  隱藏文件  ";
//        }
//        else if (file.attrib == _A_SYSTEM)
//        {
//            cout << "  系統文件  ";
//        }
//        else if (file.attrib == _A_SUBDIR)
//        {
//            cout << "  子目錄  ";
//        }
//        else
//        {
//            cout << "  存檔文件  ";
//        }
//        cout << endl;
//    } while (_findnext(longf, &file) == 0);//int __cdecl _findnext(long, struct _finddata_t *);如果找到下個文件的名字成功的話就返回0,否則返回-1  
//
//    _findclose(longf);
//
//    return 0;
//}

以上就是C++編程使用findfirst和findnext查找及遍歷文件實現示例的詳細內容,更多關于findfirst和findnext查找及遍歷文件的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/ranjiewen/p/5960976.html

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 国语自产自拍秒拍在线视频 | 日本一区二区在线不卡 | 小小水蜜桃3视频在线观看 小鸟酱喷水 | 四虎成人免费视频 | juy_661佐佐木明希在线播放 | 国产精品亚洲片在线不卡 | 视频在线网站 | 日本一级不卡一二三区免费 | tube8最近日本护士 | 91亚洲精品第一综合不卡播放 | 丝袜老师好湿好紧我要进去了 | 亚洲精品91在线 | 青青草原免费在线视频 | 耽美肉文高h| 日韩国产成人精品视频 | 欧美日韩亚毛片免费观看 | 国产一级一级一级成人毛片 | 摸咪网在线影院在线观看 | 青青青手机在线视频 | 美国69xxxx59| 97色轮| 四虎影视4hu最新地址在线884 | 丰满岳乱妇在线观看视频国产 | 亚洲国产区男人本色在线观看欧美 | 波多野给衣一区二区三区 | 久久re热在线视频精69 | 亚洲视频在线免费看 | 成人免费福利网站在线看 | 236zz宅宅最新伦理 | 操日日 | 国产成+人+综合+亚洲欧美丁香花 | 亚洲AV无码A片在线观看蜜桃 | 日本一区二区不卡久久入口 | 国产成人精品一区二三区2022 | 97涩色| 日本大学jalapsiki | 国产成人免费高清激情明星 | 色偷偷91久久综合噜噜噜 | 99久久久久久久 | 暖暖的免费观看高清视频韩国 | 免费标准高清看机机桶机机 |