因為IR作業需要用到讀取資料夾中檔案名稱,於是特地去找了一下網路上的資料。其實我是不用寫啦~阿那達從學長那兒問道如何使用C語言(參考Simple Directory Lister – The GNU C Library),而她要我去學用C++的方式來實做,然而我找到的程式碼一定會用到C的函式,看官比較一下連結和底下程式碼就知道囉~
/**
Theme: List a Directory
compiler: Dev C++ 4.9.9.2
Date: 100/04/16
Author: ShengWen
Blog: https://cg2010studio.wordpress.com/
*/
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int getdir(string dir, vector<string> &files);
int main(){
string dir = string(".");//資料夾路徑(絕對位址or相對位址)
vector<string> files = vector<string>();
getdir(dir, files);
//輸出資料夾和檔案名稱於螢幕
for(int i=0; i<files.size(); i++){
cout << files[i] << endl;
}
system("pause");
return 0;
}
int getdir(string dir, vector<string> &files){
DIR *dp;//創立資料夾指標
struct dirent *dirp;
if((dp = opendir(dir.c_str())) == NULL){
cout << "Error(" << errno << ") opening " << dir << endl;
return errno;
}
while((dirp = readdir(dp)) != NULL){//如果dirent指標非空
files.push_back(string(dirp->d_name));//將資料夾和檔案名放入vector
}
closedir(dp);//關閉資料夾指標
return 0;
}
需要注意的地方在資料夾路徑:字串中「.」表示當下資料夾,可以使用相對路徑或絕對路徑。
相對路徑只能存取該資料夾底下的資料夾,若該資料夾底下有個叫做pic的資料夾,字串為「pic」;
絕對路徑則可存取硬碟中所有資料夾,例如我要存取C:\OpenCV2.2這個資料夾,那麼字串為「C:\\OpenCV2.2」,記得要多一個「\」跳脫字元。
這裡必須要注意的是,路徑中的資料夾名稱必須「沒有空白鍵」,例如:「C:\\Documents and Settings\WEN\My Documents\My Dropbox」這樣子就不行,因為Documents and Settings和My Documents都「有空白鍵」,因此會產生錯誤訊息:
Error(2) opening C:\Documents and SettingsWENMy DocumentsMy Dropbox
請按任意鍵繼續 . . .
以上目前我不知道要怎麼解決,知道的人告訴我一下吧:p~以下為我執行上述程式碼的結果:
.
..
3n+1.cpp
Art of Pointer.cpp
Compute Time of Execution.cpp
Fabonacci Number.cpp
Generate Random Number.cpp
Insert Line Number In Code.cpp
int2char.cpp
int2string.cpp
List a Directory.cpp
List a Directory.exe
Literal.cpp
Normal Distribution.cpp
Precision.cpp
Read Size of File.cpp
RunLengthEncoding.cpp
SetTimer函數的用法.doc
snake.cpp
snake.exe
snakeOpenGL.cpp
snakeOpenGL.exe
參數傳遞的傳值、傳址、傳參考.doc
計算程式執行時間.cpp
計算記憶體使用狀況(VC++).cpp
請按任意鍵繼續 . . .
剛才有說一個點(.)表示當下資料夾,那兩個點(..)呢?表示上一層資料夾。
很神奇的是剛編譯完成就會產生.exe檔,看到上頭紅色字體,即是本程式碼的執行檔喔!
Comments on: "[C/C++] 列出資料夾中檔案名稱 (List a Directory)" (11)
我研究出另一種寫法~
#include
#include
namespace fs = std::filesystem;
int main() {
// 指定資料夾的路徑
fs::path folderPath(“/path/to/your/folder");
}
請注意,要使用檔案系統函式庫,編譯器需要支援C++17或更高版本的標準。 如果使用較舊的編譯器,可能需要更新或切換到支援更高C++標準的編譯器。
讚讚
我想問 如果我想把 列出來的檔案名稱 存進一個字串矩陣 在用存進去的字串 輸出在一個 TXT 檔 我該怎麼呢
讚讚
全部都需要加上跳脫字元就可以嘍
C:\Documents and SettingsWENMy DocumentsMy Dropbox
|
|
V
C:\\Documents and Settings\\WEN\\My Documents\\My Dropbox
讚讚
呵呵~謝謝你呀! 😀
讚讚
應該是說把資料夾裡的檔名全部都改
讚讚
那是否可以教我一下,因為我真的已經想很久想不出來!!
讚讚
老實說,這我也不會,你可以找一下網路。
讚讚
請問一下那如果在這個程式底下,把讀取的檔名改成騎他的檔名,然後顯示出來,有辦法嗎?
例如:apple.avi -> banana.avi
讚讚
這個程式只能讀取檔案名稱,而不能將讀取到的檔名改成其它名稱喔~
讚讚
您好:
請問可以讓他跑出特定的檔案嗎?
例如:都跑出.cpp檔或是.jpg檔
謝謝
讚讚
當然可以囉!
只要你再判斷files[i]中的字串尾端是否為.cpp或.jpg就可以了!
讚讚