当前位置:首页 > 一段代码演示C++根据路径判定是目录还是文件,文件搜索,文件夹遍历等问题
一段代码演示C++根据路径判定是目录还是文件,文件搜索,文件
夹遍历等问题
如何根据路径确定其对应的是一个文件目录还是单纯的文件?如果用Java,这个问题很容易解决,直接调用现成的封装好的判定函数就可以了,但是C++却没有。怎么办?刚开始想通过判定路径里面是否含有“.”号来确定其实目录还是文件,但后来发现此路不通。为什么?问题就出在Windows下面文件夹的命名规则当中--Windows文件夹命名规则没有限定其不可以使用“.”号。比如,你完全可以将一个文件夹命名为“文件夹.文件夹”。这时候如果单纯的根据“.”号去判定,那结果可定时大错特错,你的程序将很容易的认为这个地址里面住的就是一个“文件”!再严重点,你讲一个文件夹命名为“文件夹.txt”(这事完全可以的),如果按上面方法,结果很有可能是你将一个文件夹认为是一个txt文本文档。所以根据“.”号来解决这个问题全是胡扯!!!
后来经过一番查找,发现在Windows下面有一个标志位_S_IFDIR(linux下面是S_IFDIR )用来标记文件目录。如果是目录的话,该位就会被系统设置。至此以上问题的判定方法就很明确了,根据路径查询其对应的_S_IFDIR标志位即可。具体实现记录如下:
// Find.cpp : 定¨义?控?制?台?应畖用?程ì序?的?入?口ú点?。£ //
#include \ #include \ #include \ #include
//判D定¨给?定¨的?源′文?件t名?是?否?以?某3字?符?串?结á束? //sourc_str 源′文?件t名? //end_str 结á束?符?
bool EndWith(string source_str,string end_str){ }
void Find(string lpszFileName)
if (source_str.rfind(end_str)==(source_str.length()-end_str.length())) { }
return false;
return true;
{
struct _stat fileStat; //查é找?下?一?个?文?件t
while (_findnext(iFind, &fileinfo)==0/*iFind!=-1*/) {
//找?到?文?件t的?路·径?
string strFilePath = strWildcard+fileinfo.name; string oldPath=strWildcard;//暂Y存?父?级?目?录?地?址· //查é找?文?件t
intptr_t iFind = _findfirst(\, &fileinfo); if (iFind == -1) { }
_findnext(iFind, &fileinfo);//经-过y前°面?两?次?查é找?才?能?真?正y进?入?文?件t夹D
cerr << \ << endl; exit(-1); _finddata_t fileinfo;
memset(&fileinfo, 0x0, sizeof(fileinfo));
//改?变?当獭?前°工¤作痢?目?录? if (_chdir(strWildcard.c_str()) != 0) { }
cerr << \; exit(-1);
//路·径?的?标括?准?化ˉ格?式?
if (strWildcard.at(strWildcard.length() - 1) != '\\\\') { }
strWildcard += '\\\\';
//判D定¨文?件t或?文?件t夹D是?否?存?在ú if (_access(strWildcard.c_str(), 06) == -1) { }
cerr << \ << endl; exit(-1);
strWildcard = lpszFileName;//当獭?前°工¤作痢?路·径?
查é找?
if ((_stat(strFilePath.c_str(), &fileStat) == 0) && (fileStat.st_mode &
_S_IFDIR))//_S_IFDIR 是?一?个?标括?志?位?,?如?果?是?目?录?的?话°,?该?位?就í会á被?系μ统?设Θ?置? { //递蘗归é查é找?文?件t
cout << \ << strFilePath << endl; Find(strFilePath);//进?入?子哩?目?录?查é找? strWildcard=oldPath;//回?归é父?级?目?录?
}else{
if (EndWith(strFilePath,\))//是?否?是?txt文?件t
cout << \ << strFilePath << endl; continue;
}
// 判D断?找?到?文?件t的?是?否?包悒?含?\或?\ // string str=fileinfo.name; // string str1 = \
// string str2 = \
// string::size_type idx1 = str.find( str1 ); // string::size_type idx2 = str.find( str2 );
// if ( idx2 != string::npos /*&&idx2 != string::npos*/) { // continue;
// }else if ( idx1 != string::npos /*&&idx2 != string::npos*/) // string strFileName = strWildcard+fileinfo.name; // cout << \
// } // else{ // //找?到?文?件t的?路·径?
// string strFilePath = strWildcard+fileinfo.name; // string old=strWildcard; // //递蘗归é查é找?文?件t // Find(strFilePath); // strWildcard=old; // }
}
//结á束?查é找? _findclose(iFind);
}
int main() { string dir;
cout << \;
cin >> dir;
{ }
return 0;
Find(dir);//搜?索÷输?入?路·径?下?面?的?所ù有瓺文?件t夹D(辍?包悒?括ぁ?子哩?目?录?)?,?并¢查é找?特?定¨格?式?的?文?件t
if (_chdir(dir.c_str()) != 0) { }
cerr << \; exit(-1);
if (dir.at(dir.length() - 1) != '\\\\') { }
dir += '\\\\';
if (_access(dir.c_str(), 06) == -1) { }
cerr << \ << endl; exit(-1);
共分享92篇相关文档