Linux和Windows系統下C++讀取資料夾下檔名
我的開發環境為Ubuntu+Qt,讀取資料夾下檔名時會找不到io.h,通過查詢資料瞭解到Windows和Linux下的標頭檔案是不一樣的,下面首先介紹Linux系統下檔名的獲取
一、Linux系統下檔名獲取
(1)C語言版本
//LINUX/UNIX c獲取某個目錄下的所有檔案的檔名
#include <stdio.h>
#include <dirent.h>
int main(int argc, char * argv[])
{
struct dirent *ptr;
DIR *dir;
dir=opendir("./file");
printf("檔案列表:\n");
while((ptr=readdir(dir))!=NULL)
{
//跳過'.'和'..'兩個目錄
if(ptr->d_name[0] == '.')
continue;
printf("%s\n",ptr->d_name);
}
closedir(dir);
return 0;
}
(2)C++版本
#include <iostream>
#include <vector>
#include <string>
#include <dirent.h>
using namespace std;
int main(int argc, char * argv[])
{
struct dirent *ptr;
DIR *dir;
string PATH = "./file";
dir=opendir(PATH.c_str());
vector<string> files;
cout << "檔案列表: "<< endl;
while((ptr=readdir(dir))!=NULL)
{
//跳過'.'和'..'兩個目錄
if(ptr->d_name[0] == '.')
continue;
//cout << ptr->d_name << endl;
files.push_back(ptr->d_name);
}
for (int i = 0; i < files.size(); ++i)
{
cout << files[i] << endl;
}
closedir(dir);
return 0;
}
二、Windows平臺
#include <io.h>
#include <fstream>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
//獲取所有的檔名
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) );
GetAllFiles( 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);
}
}
//獲取特定格式的檔名
void GetAllFormatFiles( string path, vector<string>& files,string format)
{
//檔案控制代碼
long hFile = 0;
//檔案資訊
struct _finddata_t fileinfo;
string p;
if((hFile = _findfirst(p.assign(path).append("\\*" + format).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) );
GetAllFormatFiles( p.assign(path).append("\\").append(fileinfo.name), files,format);
}
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
// 該函式有兩個引數,第一個為路徑字串(string型別,最好為絕對路徑);
// 第二個引數為資料夾與檔名稱儲存變數(vector型別,引用傳遞)。
// 在主函式中呼叫格式(並將結果儲存在檔案"AllFiles.txt"中,第一行為總數):
int main()
{
string filePath = "testimages\\water";
vector<string> files;
char * distAll = "AllFiles.txt";
//讀取所有的檔案,包括子檔案的檔案
//GetAllFiles(filePath, files);
//讀取所有格式為jpg的檔案
string format = ".jpg";
GetAllFormatFiles(filePath, files,format);
ofstream ofn(distAll);
int size = files.size();
ofn<<size<<endl;
for (int i = 0;i<size;i++)
{
ofn<<files[i]<<endl;
cout<< files[i] << endl;
}
ofn.close();
return 0;
}