1. 程式人生 > >C++ 獲取資料夾下的所有檔名

C++ 獲取資料夾下的所有檔名

獲取資料夾下所有的檔名是常用的功能,今天再一次有這樣的需求,所有就在網上查找了很多,並記下以供後用。

原文:http://blog.csdn.NET/cxf7394373/article/details/7195661

原文:http://qiaoxinwang.blog.163.com/blog/static/86096452010612139172/

標頭檔案:#include<io.h>

 1 char * filePath = "D:\\sample";  

 1 vector<string> files;  
 2   
 3 ////獲取該路徑下的所有檔案  
 4 getFiles(filePath, files );  
5 6 char str[30]; 7 int size = files.size(); 8 for (int i = 0;i < size;i++) 9 { 10 cout<<files[i].c_str()<<endl; 11 }
 1 void getFiles( string path, vector<string>& files )  
 2 {  
 3     //檔案控制代碼  
 4     long   hFile   =   0;  
 5     //檔案資訊  
 6     struct
_finddata_t fileinfo; 7 string p; 8 if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1) 9 { 10 do 11 { 12 //如果是目錄,迭代之 13 //如果不是,加入列表 14 if((fileinfo.attrib & _A_SUBDIR)) 15 {
16 if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0) 17 getFiles( p.assign(path).append("\\").append(fileinfo.name), files ); 18 } 19 else 20 { 21 files.push_back(p.assign(path).append("\\").append(fileinfo.name) ); 22 } 23 }while(_findnext(hFile, &fileinfo) == 0); 24 _findclose(hFile); 25 } 26 }

_finddata_t 的使用  

那麼到底如何查詢檔案呢?我們需要一個結構體和幾個大家可能不太熟悉的函式。這些函式和結構體在<io.h>的標頭檔案中,結構體為struct _finddata_t ,函式為_findfirst、_findnext和_fineclose。具體如何使用,我會慢慢講來~
首先講這個結構體吧~ struct _finddata_t ,這個結構體是用來儲存檔案各種資訊的。說實話,這個結構體的具體定義程式碼,我沒有找到,不過還好,文件裡面在_find裡有比較詳細的成員變數介紹。我基本上就把文件翻譯過來講吧:


unsigned atrrib:檔案屬性的儲存位置。它儲存一個unsigned單元,用於表示檔案的屬性。檔案屬性是用位表示的,主要有以下一些:_A_ARCH(存檔)、_A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、_A_SUBDIR(資料夾)、_A_SYSTEM(系統)。

這些都是在<io.h>中定義的巨集,可以直接使用,而本身的意義其實是一個無符號整型(只不過這個整型應該是2的幾次冪,從而保證只有一位為1,而其他位為0)。既然是位表示,那麼當一個檔案有多個屬性時,它往往是通過位或的方式,來得到幾個屬性的綜合。例如只讀+隱藏+系統屬性,應該為:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
time_t time_create:這裡的time_t是一個變數型別(長整型?相當於long int?),用來儲存時間的,我們暫時不用理它,只要知道,這個time_create變數是用來儲存檔案建立時間的就可以了。
time_t time_access:檔案最後一次被訪問的時間。
time_t time_write:檔案最後一次被修改的時間。
_fsize_t size:檔案的大小。這裡的_fsize_t應該可以相當於unsigned整型,表示檔案的位元組數。
char name[_MAX_FNAME]:檔案的檔名。這裡的_MAX_FNAME是一個常量巨集,它在<stdlib.h>標頭檔案中被定義,表示的是檔名的最大長度。
以此,我們可以推測出,struct _finddata_t ,大概的定義如下:

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

        前面也說了,這個結構體是用來儲存檔案資訊的,那麼如何把一個硬碟檔案的檔案資訊“存到”這個結構體所表示的記憶體空間裡去呢?這就要靠_findfirst、_findnext和_fineclose三個函式的搭配使用了。

        首先還是對這三個函式一一介紹一番吧……

        long _findfirst( char *filespec, struct _finddata_t *fileinfo );

        返回值:如果查詢成功的話,將返回一個long型的唯一的查詢用的控制代碼(就是一個唯一編號)。這個控制代碼將在_findnext函式中被使用。若失敗,則返回-1。

        引數:

        filespec:標明檔案的字串,可支援萬用字元。比如:*.c,則表示當前資料夾下的所有後綴為C的檔案。

        fileinfo :這裡就是用來存放檔案資訊的結構體的指標。這個結構體必須在呼叫此函式前宣告,不過不用初始化,只要分配了記憶體空間就可以了。函式成功後,函式會把找到的檔案的資訊放入這個結構體中。

        int _findnext( long handle, struct _finddata_t *fileinfo );

        返回值:若成功返回0,否則返回-1。

        引數:

        handle:即由_findfirst函式返回回來的控制代碼。

        fileinfo:檔案資訊結構體的指標。找到檔案後,函式將該檔案資訊放入此結構體中。

        int _findclose( long handle );

        返回值:成功返回0,失敗返回-1。

        引數:

        handle :_findfirst函式返回回來的控制代碼。

        大家看到這裡,估計都能猜到個大概了吧?先用_findfirst查詢第一個檔案,若成功則用返回的控制代碼呼叫_findnext函式查詢其他的檔案,當查詢完畢後用,用_findclose函式結束查詢。恩,對,這就是正確思路。下面我們就按照這樣的思路來編寫一個查詢C:\WINDOWS資料夾下的所有exe可執行檔案的程式。
        

 1 #include <stdio.h>
 2         #include <io.h>
 3 
 4 
 5         const char *to_search="C:\\WINDOWS\\*.exe";        //欲查詢的檔案,支援萬用字元
 6 
 7 
 8         int main()
 9         {
10              long handle;                                                //用於查詢的控制代碼
11              struct _finddata_t fileinfo;                          //檔案資訊的結構體
12              handle=_findfirst(to_search,&fileinfo);         //第一次查詢
13              if(-1==handle)return -1;
14              printf("%s\n",fileinfo.name);                         //打印出找到的檔案的檔名
15              while(!_findnext(handle,&fileinfo))               //迴圈查詢其他符合的檔案,知道找不到其他的為止
16              {
17                   printf("%s\n",fileinfo.name);
18             }
19              _findclose(handle);                                      //別忘了關閉控制代碼
20              system("pause");
21              return 0;
22         }


        當然,這個檔案的查詢是在指定的路徑中進行,如何遍歷硬碟,在整個硬碟中查詢檔案呢?大家可以在網路上搜索檔案遞迴遍歷等方法,這裡不再做進一步介紹。


        細心的朋友可能會注意到我在程式的末尾用了一個system函式。這個與程式本身並沒有影響,和以前介紹給大家的使用getchar()函式的作用相同,只是為了暫停一下,讓我們能看到命令提示符上輸出的結果而已。不過system函式本身是一個非常強大的函式。大家可以查查MSDN看看~ 簡單來說,它是一個C語言與作業系統的相互平臺,可以在程式裡通過這個函式,向作業系統傳遞command命令

更多例子:

主要用到了以下幾個標頭檔案(類):io.h, fstream, string。
 
首先,讀取某給定路徑下所有資料夾與檔名稱,並帶完整路徑。實現程式碼如下:

 void getAllFiles( string path, vector<string>& files) 
 { 
   //檔案控制代碼 
   long  hFile  =  0; 
   //檔案資訊 
   struct _finddata_t fileinfo; 
   string p; 
   if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1) 
   { 
     do 
     {  
       if((fileinfo.attrib & _A_SUBDIR)) 
       { 
         if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0) 
         {
          files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
           getFilesall( p.assign(path).append("\\").append(fileinfo.name), files ); 
         }
       } 
       else 
       { 
         files.push_back(p.assign(path).append("\\").append(fileinfo.name) ); 
       } 
     }while(_findnext(hFile, &fileinfo) == 0); 
     _findclose(hFile); 
   } 
 } 

該函式有兩個引數,第一個為路徑字串(string型別,最好為絕對路徑);第二個引數為資料夾與檔名稱儲存變數(vector型別,引用傳遞)。
在主函式中呼叫格式(並將結果儲存在檔案"AllFiles.txt"中,第一行為總數):

 char * filePath = "E:\\YunShi"; 
 vector<string> files; 
 char * distAll = "AllFiles.txt";
 getFilesall(filePath, files);
 ofstream ofn(distAll);
 int size = files.size(); 
 ofn<<size<<endl;
 for (int i = 0;i<size;i++) 
 { 
   ofn<<files[i]<<endl; 
 }
 ofn.close();

同理,只讀取某給定路徑下的當前資料夾名(以下類似,只給出函式,呼叫案例同上):

void getJustCurrentDir( string path, vector<string>& files) 
 { 
   //檔案控制代碼 
   long  hFile  =  0; 
  //檔案資訊 
   struct _finddata_t fileinfo; 
   string p; 
   if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1) 
   { 
     do 
     {  
       if((fileinfo.attrib & _A_SUBDIR)) 
       { 
         if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0) 
         {
           files.push_back(fileinfo.name);
           //files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
         }
           
       }  
     }while(_findnext(hFile, &fileinfo) == 0); 
     _findclose(hFile); 
   } 
 } 

只讀取某給定路徑下的當前檔名:

 void getJustCurrentFile( string path, vector<string>& files) 
 { 
   //檔案控制代碼 
   long  hFile  =  0; 
   //檔案資訊 
   struct _finddata_t fileinfo; 
   string p; 
   if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1) 
   { 
     do 
     {  
       if((fileinfo.attrib & _A_SUBDIR)) 
       { 
         ;
       } 
       else 
       { 
         files.push_back(fileinfo.name);
         //files.push_back(p.assign(path).append("\\").append(fileinfo.name) ); 
       }  
     }while(_findnext(hFile, &fileinfo) == 0); 
     _findclose(hFile); 
   } 
 } 

只讀取某給定路徑下的所有檔名(即包含當前目錄及子目錄的檔案):

void getFilesAll( string path, vector<string>& files) 
 { 
   //檔案控制代碼 
   long  hFile  =  0; 
   //檔案資訊 
   struct _finddata_t fileinfo; 
   string p; 
   if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1) 
   { 
     do 
     {  
       if((fileinfo.attrib & _A_SUBDIR)) 
       { 
         if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0) 
         {
           //files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
           getFilesA( p.assign(path).append("\\").append(fileinfo.name), files ); 
         }
       } 
       else 
       { 
         files.push_back(p.assign(path).append("\\").append(fileinfo.name) ); 
       } 
     }while(_findnext(hFile, &fileinfo) == 0); 
     _findclose(hFile); 
   } 
 } 

相關推薦

C/C++ 獲取資料所有檔名 windows和linux通用

參考: ################################################# 利用C/C++編寫程式以獲取資料夾內所有子檔名,以下程式參考網路上諸多博文: 標頭檔案如下: #include <iostream> #inclu

C++獲取資料所有檔名稱的三種方式

1 利用dos命令把資料夾下所有檔名存入指定檔案,再從檔案讀取,存入vector中 string imglist_file = "test_result\\imglist.txt";//儲存檔名稱列表 string temp_imgname; stri

Matlab獲取資料所有檔名並將資料按矩陣賦值給變數

fileFolder=fullfile('D:\MATLAB\bin\trc'); dirOutput=dir(fullfile(fileFolder,'*.trc')); fileNames={dirOutput.name}; n = 1; for i=fileNames

使用C++獲取資料所有檔名(windows環境)

由於經常有讀取一個資料夾中的很多隨機編號的檔案,很多時候需要讀取某些特定格式的所有檔案。 下面的程式碼可以讀取指定檔案家中的所有檔案和資料夾中格式為jpg的檔案 windows平臺程式碼:#if 1 #include <io.h> #include

C/C++獲取資料所有檔案的名字及全路徑

在實際中,會遇到需要通過程式獲取當前路徑下所有檔案的名稱,以下函式可以實現獲取所給路徑下檔名 及檔案對應的全路徑;需要包含文章末尾的兩個標頭檔案#include <vector> #include"dirent.h" #include"unistd.h" usi

c++ 獲取資料所有檔案

用c++獲取指定資料夾下的所有檔案,包括子資料夾裡的檔案。 void GetAllFiles( string path, list<string>&AllFiles, bool

OpenCV獲取資料所有檔名

一、OpenCV中有實現遍歷資料夾下所有檔案的類Directory,它裡面包括3個成員函式:(1)、GetListFiles:遍歷指定資料夾下的所有檔案,不包括指定資料夾內的資料夾;(2)、GetListFolders:遍歷指定資料夾下的所有資料夾,不包括指定資料夾下的檔

轉載 C++ 獲取資料所有檔名

獲取資料夾下所有的檔名是常用的功能,今天再一次有這樣的需求,所有就在網上查找了很多,並記下以供後用。 原文:http://blog.csdn.NET/cxf7394373/article/details/7195661 原文:http://qiaoxinwang.blog.163.com/blog/stat

C++ 獲取資料所有檔名

獲取資料夾下所有的檔名是常用的功能,今天再一次有這樣的需求,所有就在網上查找了很多,並記下以供後用。 原文:http://blog.csdn.NET/cxf7394373/article/details/7195661 原文:http://qiaoxinwang.blog.163.com/blog/stati

C#獲取資料所有檔案的檔名

String path = @"X:\xxx\xxx"; //第一種方法 var files = Directory.GetFiles(path, "*.txt"); fo

如何用C#獲取指定資料所有檔名?

如題:         比如我要在ASP.NET程式的伺服器上DATA資料夾下所以有檔名.然後輸出.希望用C#程式碼實現...  可以用   Directory.GetFiles();方法... 返回包含檔名的路徑.然後再擷取檔名 如: string[]   filename

C++獲取資料具有特殊字尾的所有檔名(Ubuntu)

//用C++實現獲取某個檔案下,包含特殊字尾名的所有檔名#include<iostream>#include<vector>#include<string.h> //包含strcmp的標頭檔案,也可用: #include <ctrin

獲取資料所有圖片名字,用 glob模組,簡單操作就可以,不用os的操作 python中的一個好用的檔名操作模組glob

轉 python中的一個好用的檔名操作模組glob 2017年09月19日 16:48:13 何雷 閱讀數:1963

C++遍歷獲取資料下面所有檔名

#include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> #ifdef linux #incl

C語言獲取資料所有檔名並列印到txt中

程式如下: /********************************************************************************************

Linux C 讀取資料所有檔案(包括子資料)的檔名

Linux C  下面讀取資料夾要用到結構體struct dirent,在頭#include <dirent.h>中,如下: #include <dirent.h> struct dirent { long d_ino; /* inode number 索引節點號

C++獲得資料所有檔案的路徑及檔名

標頭檔案:#include< io.h > filePath:資料夾路徑 vector<string> files; ////獲取該路徑下的所有檔案 getFil

boost/system獲取資料所有檔名稱

需要包含#include <boost/filesystem.hpp> BOOL GetAllFiles(vector<string>& vecFiles, string iPath, BOOL bRecursive) {     b

C#獲取資料的子資料

 public static List <string> getDirectory(string path)         {             List<Stri

C#刪除資料所有的檔案

      上傳到temp資料夾下面的檔案需要刪除掉,使用FileInfo.Delete 方法可以成功的刪除壓縮包檔案。當使用FileInfo.Delete 方法刪除資料夾的時報錯{"對路徑“D:\\專案\\temp”的訪問被拒絕。"}  。找了一下資料使用Directo