C++ 下 一个关于读取文件名的问题!

kaprix 2008-04-17 09:26:36
如何读取一个特定目录下的所有文件名,并且将这些文件名每行一个的输出在一个文本文件中呢?
如果是该文件夹下几个特定的文件类型呢?
谢谢了
...全文
706 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaprix 2008-04-18
  • 打赏
  • 举报
回复
谢谢大家了
wukexin 2008-04-17
  • 打赏
  • 举报
回复
这是我自己用的

#include "../wukexin/file/file_info.h"
#include "../wukexin/file/file.h"
#include "../wukexin/help/help.h"
//
#include "boost/program_options.hpp"
#include "boost/progress.hpp"
#include "boost/filesystem.hpp"
#include "boost/bind.hpp"
#include "boost/date_time.hpp"
//#include "boost/date_time/posix_time/posix_time.hpp"

using namespace boost;
namespace po = boost::program_options;

#include <iostream>
#include <algorithm>
#include <iterator>
#include <functional>
#include <bitset>
using namespace std;
//
namespace fs = boost::filesystem;
typedef vector<string> C;

// A helper function to simplify the main part.

struct IsFileAttributes : public binary_function<const DWORD,const string,bool>{
bool operator() (const DWORD aim,const string fname){
using namespace wukexin;
DWORD attrib=GetFileAttributes(fname.c_str() );
//static unsigned limit=32;
bitset<32> ba(aim),bf(attrib);
unsigned condition=ba.count();
unsigned success_count(0);
for(unsigned i=0;i<32;i++){
if( ba.test(i) && bf.test(i) ) success_count++;
}
if( success_count == condition )
return true;
else
return false;
}
};
//
enum SelecFileTime{create,write,access};
//

bool isFileTime(const SelecFileTime x,const string ftime,string fname){
//boost::progress_timer t( std::clog );
wukexin::Cfile_information file(fname);
string ftime2;
if( create == x ) ftime2=file.cFileTime();
if( write == x ) ftime2=file.wFileTime();
if( access== x ) ftime2=file.aFileTime();
using namespace boost::gregorian;
using namespace boost::posix_time;
if( ftime.length() > 10 ){
ptime t1(time_from_string(ftime) );
if( t1.is_not_a_date_time() ) return false;
ptime t2(time_from_string(ftime2) );
//cout<<ftime<<"\t"<<to_iso_extended_string(t1)<<"\t"<<to_iso_extended_string(t2)<<"\n";
}
else{
date d1( from_string(ftime) );
date d2( from_string(ftime2) );
if( d1 == d2 ) return true;
if( d1.is_not_a_date() ) return false;
}
return false;
}

//
void pathList(const std::string fileName,C& result){
using namespace std;
using namespace fs;
//boost::progress_timer t( std::clog );
try{
if (exists(fileName) && is_directory(fileName) )
{
transform(recursive_directory_iterator(fileName), recursive_directory_iterator(),
back_inserter(result),mem_fun_ref(path::native_file_string)
);
}
}
catch(const filesystem_error& e ){
std::clog<<e.what()<<"\n";
};
}
//
void print(const string fname){
cout<<fname<<"\n";
}
//
void display(const string fname){
using namespace fs;
wukexin::Cfile_information file(fname );
file.print();
}
//
int main(int ac, char* av[])
{
try {
boost::progress_timer t( std::clog );
int opt;
po::options_description desc("Allowed options");
desc.add_options()
("","显示当前目录")
("help,?", "输出帮助")
("pathName", po::value< vector<string> >(), "输入目录名")
//筛选指定文件属性
("attributes,A",po::value<string>(),"显示指定熟性文件")
("create_time",po::value< string >(),"创建时间( \t 例如: 1997-12-31)" )
("last_access_time",po::value< string >(),"上次访问时间( \t 例如: 12:02:53)" )
("last_write_time",po::value< string >(),"上次写入的时间( \t 例如: 2002-01-19 1:1:1)")
//
("complete,C","详细显示目录")
;

po::positional_options_description p;
p.add("pathName", -1);

po::variables_map vm;
po::store(po::command_line_parser(ac, av).
options(desc).positional(p).run(), vm);
po::notify(vm);

if (vm.count("help")) {
cout << "Usage: options_description [options]\n";
cout << desc;
return 0;
}
//目录列表
C fileList;
//
if (vm.count("pathName"))
{
const vector<string>& dirs = vm["pathName"].as< vector<string> >();\
for(vector<string>::const_iterator itr=dirs.begin();itr!=dirs.end();++itr){
pathList(*itr,fileList);
}
}
else{
using namespace boost::filesystem;
path current_path( initial_path<fs::path>() );
pathList(current_path.native_file_string(),fileList);
}
//
if(vm.count("attributes") ){
string sattribs = vm["attributes"].as<string>();
DWORD attrib = wukexin::stringToAttrib(sattribs);
erase_if(fileList,!boost::bind(IsFileAttributes(),attrib,_1) );
}
//
if(vm.count("create_time") ){
string sftime = vm["create_time"].as< string >();
erase_if(fileList,!boost::bind(isFileTime,create,sftime,_1) );
}
if(vm.count("last_write_time") ){
string sftime = vm["last_write_time"].as< string >();
erase_if(fileList,!boost::bind(isFileTime,write,sftime,_1) );
}
if(vm.count("last_access_time") ){
string sftime = vm["last_access_time"].as< string >();
erase_if(fileList,!boost::bind(isFileTime,access,sftime,_1) );
}
//
if (vm.count("complete") ){
for_each(fileList.begin(),fileList.end(),display);
cout<<"There are "<<fileList.size()<<" objects.\n";
return 0;
}
//缺省输出结果
//desc.print(cout);
for_each(fileList.begin(),fileList.end(),print);
cout<<"There are "<<fileList.size()<<" files and directories.\n";
}
catch(exception& e)
{
cout << e.what() << "\n";
return 1;
}
return 0;
}
星羽 2008-04-17
  • 打赏
  • 举报
回复

#include "windows.h"
#include "iostream"
using namespace std;

void search(char path[]) {

WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char filePath[128];
char fileName[128];
bool bWork = true;

sprintf(filePath, "%s\\*", path);
hFind = FindFirstFile(filePath, &FindFileData);

if (hFind == INVALID_HANDLE_VALUE)
return;

while (bWork) {

if (strcmp(FindFileData.cFileName, ".") && strcmp(FindFileData.cFileName, "..")) {

sprintf(fileName, "%s\\%s", path, FindFileData.cFileName);

if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
search(fileName);
else
cout<<fileName<<endl;
}

bWork = FindNextFile(hFind, &FindFileData);
}

FindClose(hFind);
}

int main()
{
FILE* file = freopen("out.txt", "w", stdout);
search("E:\\");
fclose(file);
return 0;
}
kaprix 2008-04-17
  • 打赏
  • 举报
回复
你好,我还有一个问题,我在VC里实现,我希望这个查找文件功能在一个按钮中即

void CNewlistDlg::OnAddfilebutton()
{
// TODO: Add your control notification handler code here
CFileDialog m_ldFile(TRUE);
if (m_ldFile.DoModal() == IDOK)
{
m_sResults = m_ldFile.GetFileName();
// chain = m_ldFile.GetFileName();
UpdateData(FALSE);
}


FILE* f;
f = fopen("PubList.m3u","rw");
fprintf(f,"\n%s\n",chain);
//fclose(f);
}

应该怎么办呢?

谢谢了
myullian 2008-04-17
  • 打赏
  • 举报
回复
趁机学习一下,代码收下了
YFY 2008-04-17
  • 打赏
  • 举报
回复
如果楼主用VC,则可用:
FindFirstFile、FindNextFile,不要忘了FindColse。很简单的。

如果是C、C++则用:
_findfirst、_findnext、_findclose。
baihacker 2008-04-17
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080301/14/bded553d-4f07-43d5-bb8a-9f84abf3d948.html
这里有
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-17 09:26
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下