C++瀏覽目錄下所有檔案(window和linux版本)
阿新 • • 發佈:2018-12-17
原本以為這麼常用的功能應該是標準C支援的,試了一下才發現不同平臺差異挺大。
參考部落格:https://blog.csdn.net/u012005313/article/details/50687297
上程式碼
test_dir.cpp
#include <vector> #include <algorithm> #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <string> #ifdef linux # include <unistd.h> # include <dirent.h> #else # include <direct.h> # include <io.h> # define getcwd _getcwd #endif using namespace std; vector<string> getFiles(string path) { vector<string> files; string p; #ifdef _WIN32 _finddata_t file; long lf; if ((lf=_findfirst(p.assign(path).append("\\*").c_str(), &file)) == -1) { cout<<path<<" not found!!!"<<endl; } else { do { //cout<< file.name <<endl; if (strcmp(file.name, ".") == 0 || strcmp(file.name, "..") == 0) continue; files.push_back(p.assign(path).append("\\").append(file.name)); } while(_findnext(lf, &file) == 0); } //cout << "bye" << endl; _findclose(lf); #endif #ifdef linux DIR *dir; struct dirent *ptr; char base[1000]; if ((dir=opendir(path.c_str())) == NULL) { perror("Open dir error..."); exit(1); } while ((ptr=readdir(dir)) != NULL) { if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir continue; else if(ptr->d_type == 8) ///file files.push_back(p.assign(path).append("/").append(ptr->d_name)); else if(ptr->d_type == 10) ///link file continue; else if(ptr->d_type == 4) ///dir continue; } closedir(dir); #endif sort(files.begin(), files.end()); return files; } int main(void) { char current_address[500] = {0}; getcwd(current_address, 500); cout<<"[begin] " << current_address<<endl; vector<string> files = getFiles((string)current_address); for (int i=0; i<files.size(); i++) { cout<<files[i]<<endl; } cout<<"[end]..."<<endl; return 0; }
在linux的makefile
CC=g++
test_dir: test_dir.cpp
$(CC) test_dir.cpp -o test_dir
all: test_dir
Window下的nmake檔案
CFLAGS = -nologo -O2 -MD -I. SRCS = .\test_dir.cpp test_dir.exe: $(SRCS) cl $(CFLAGS) [email protected] $** del *.obj all: test_dir.exe clean: del /Q *.exe *.obj *.manifest
編譯執行都沒問題