Tôi muốn lấy tên tệp của tất cả các tệp có phần mở rộng cụ thể trong một thư mục cụ thể (và đệ quy, các thư mục con của nó). Đó là, tên tệp (và phần mở rộng), không phải là đường dẫn tệp đầy đủ. Điều này là cực kỳ đơn giản trong các ngôn ngữ như Python, nhưng tôi không quen thuộc với các cấu trúc cho điều này trong C + +. Nó được hoàn thiện bằng cách nào?Cách lấy danh sách các tệp có phần mở rộng cụ thể trong một thư mục nhất định?
Trả lời
#define BOOST_FILESYSTEM_VERSION 3
#define BOOST_FILESYSTEM_NO_DEPRECATED
#include <boost/filesystem.hpp>
namespace fs = ::boost::filesystem;
// return the filenames of all files that have the specified extension
// in the specified directory and all subdirectories
void get_all(const fs::path& root, const string& ext, vector<fs::path>& ret)
{
if(!fs::exists(root) || !fs::is_directory(root)) return;
fs::recursive_directory_iterator it(root);
fs::recursive_directory_iterator endit;
while(it != endit)
{
if(fs::is_regular_file(*it) && it->path().extension() == ext) ret.push_back(it->path().filename());
++it;
}
}
@ namar0x0309 Tôi đã áp dụng chỉnh sửa của bạn, đó là chính xác. – Gigi
ở đó, đây là câu trả lời di động. –
Điều duy nhất không hiệu quả đối với tôi là 'và', tôi đã thay thế nó bằng '&&'. Phần còn lại là tuyệt vời. +1 –
Bạn không nói bạn đang sử dụng hệ điều hành nào, nhưng có một số tùy chọn.
Khi người nhận xét đã đề cập, boost::filesystem sẽ hoạt động nếu bạn có thể sử dụng tăng.
tùy chọn khác là
Trên cửa sổ bạn làm điều gì đó như thế này:
void listFiles(const char* path)
{
struct _finddata_t dirFile;
long hFile;
if ((hFile = _findfirst(path, &dirFile)) != -1)
{
do
{
if (!strcmp(dirFile.name, "." )) continue;
if (!strcmp(dirFile.name, ".." )) continue;
if (gIgnoreHidden)
{
if (dirFile.attrib & _A_HIDDEN) continue;
if (dirFile.name[0] == '.') continue;
}
// dirFile.name is the name of the file. Do whatever string comparison
// you want here. Something like:
if (strstr(dirFile.name, ".txt"))
printf("found a .txt file: %s", dirFile.name);
} while (_findnext(hFile, &dirFile) == 0);
_findclose(hFile);
}
}
On Posix, như Linux hoặc OSX:
void listFiles(const char* path)
{
DIR* dirFile = opendir(path);
if (dirFile)
{
struct dirent* hFile;
errno = 0;
while ((hFile = readdir(dirFile)) != NULL)
{
if (!strcmp(hFile->d_name, "." )) continue;
if (!strcmp(hFile->d_name, "..")) continue;
// in linux hidden files all start with '.'
if (gIgnoreHidden && (hFile->d_name[0] == '.')) continue;
// dirFile.name is the name of the file. Do whatever string comparison
// you want here. Something like:
if (strstr(hFile->d_name, ".txt"))
printf("found an .txt file: %s", hFile->d_name);
}
closedir(dirFile);
}
}
Giải pháp của bạn sẽ tìm thấy tệp trong mẫu, "foo.txt.exe". Tôi sẽ không xem xét rằng để có một phần mở rộng .txt. –
Trên cửa sổ, bạn đang đặt giá trị của "gIgnoreHidden" ở đâu. Nó là một lá cờ? – hshantanu
có - một boolean toàn cầu của nó trong ví dụ. Nhưng thực sự bạn có thể làm bất cứ điều gì ở đây - như chuyển nó vào như một đối số khác cho listFiles. –
danh sách Nhận các tập tin và quá trình mỗi tập tin và lặp qua và lưu trữ lại trong thư mục khác
void getFilesList(string filePath,string extension, vector<string> & returnFileName)
{
WIN32_FIND_DATA fileInfo;
HANDLE hFind;
string fullPath = filePath + extension;
hFind = FindFirstFile(fullPath.c_str(), &fileInfo);
if (hFind != INVALID_HANDLE_VALUE){
returnFileName.push_back(filePath+fileInfo.cFileName);
while (FindNextFile(hFind, &fileInfo) != 0){
returnFileName.push_back(filePath+fileInfo.cFileName);
}
}
}
SỬ DỤNG: bạn có thể sử dụng như tải này tất cả các file từ thư mục và lặp qua từng người một
String optfileName ="";
String inputFolderPath ="";
String extension = "*.jpg*";
getFilesList(inputFolderPath,extension,filesPaths);
vector<string>::const_iterator it = filesPaths.begin();
while(it != filesPaths.end())
{
frame = imread(*it);//read file names
//doyourwork here (frame);
sprintf(buf, "%s/Out/%d.jpg", optfileName.c_str(),it->c_str());
imwrite(buf,frame);
it++;
}
mã C++ 17
#include <fstream>
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
std::string path("/your/dir/");
std::string ext(".sample");
for(auto& p: fs::recursive_directory_iterator(path)
{
if(p.path().extension() == ext())
std::cout << p << '\n';
}
return 0;
}
[ 'đẩy mạnh :: filesystem'] (http://www.boost.org/doc/libs/1_41_0/libs/filesystem/doc/index.htm) phù hợp với các tệp. – chris
Viết C++ sau khi Python phải cảm thấy giống như viết bằng ngôn ngữ assembly sau C++ :) Theo như tiêu chuẩn C++ thì có liên quan, đây là một nhiệm vụ tốn nhiều mã đáng ngạc nhiên. Tôi thứ hai đề nghị sử dụng 'boost :: filesystem'. – dasblinkenlight
Tuyệt vời, cảm ơn bạn đã tham khảo. Tôi sẽ kiểm tra điều đó. – Jim