轉載 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。
首先,讀取某給定路徑下所有資料夾與檔名稱,並帶完整路徑。實現程式碼如下:
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 |
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"中,第一行為總數):
1 2 3 4 5 6 7 8 9 10 11 12 |
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();
|
同理,只讀取某給定路徑下的當前資料夾名(以下類似,只給出函式,呼叫案例同上):
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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);
}
}
|
只讀取某給定路徑下的當前檔名:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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);
}
}
|
只讀取某給定路徑下的所有檔名(即包含當前目錄及子目錄的檔案):
?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 |
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
轉載 C++ 獲取資料夾下的所有檔名
獲取資料夾下所有的檔名是常用的功能,今天再一次有這樣的需求,所有就在網上查找了很多,並記下以供後用。 原文:http://blog.csdn.NET/cxf7394373/article/details/7195661 原文:http://qiaoxinwang.blog.163.com/blog/stat
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/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