请批改补充以下代码完成能搜索打印出盘内所有txt文件的程序
请修改补充以下代码完成能搜索打印出盘内所有txt文件的程序
因为本人需要把盘内某种类型的文件都找出来 比如txt jpg avi 。
1 试过在扫描目录时候复制一份路径吧//改成\\然后搜索txt文件 但是有错误 。。从刚得到这个代码然后百度理解 加代码 调试折腾了几天还是没完成 。。
2 这个程序运行后能扫描所有文件 但是打印出来文件的很少 当我换个只包含7个文件的文件夹扫描时都能打印出来 然后再大一点的子目录有打印不出所有文件了 然后试想过是不是&FindFileData内存太小不够放的 。具体怎么回事请大神帮我解答下
3 希望能够以下面的代码为模板修改补充完成 因为这个我折腾了很久想了很多很想学习到底如何让用这个完成 。谢谢了
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;
//可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符
void _find(string path){
//取路径名最后一个"//"之前的部分,包括"//"
string prefix = path.substr(0, path.find_last_of('//') + 1);
WIN32_FIND_DATA FindFileData;
HANDLE hFind = ::FindFirstFile(path.c_str(), &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
cout << "文件通配符错误" << endl;
return;
}
while (TRUE)
{
//目录
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//不是当前目录,也不是父目录
if (FindFileData.cFileName[0] != '.')
{
//查找下一级目录
_find(prefix + FindFileData.cFileName + "//" + "*.*");
}
}
//文件
else
{
cout << FindFileData.cFileName << endl;
}
if (!FindNextFile(hFind, &FindFileData))
break;
}
FindClose(hFind);
}
void main(){
_find("E:");//目录:E盘
_find("E://*.*");//E盘下所有文件
string str = "./test"; //这里指定的是目录
string path;
cout<<"请输入文件通配符:"<<flush;
cin>>path;
str=str+path;
_find((char*)str.c_str());//可以处理".",".." 不可以处理"*","..//*"
_find(str);//可以处理"*","..//*" 不可以处理".",".."
system("pause");
}
------解决思路----------------------
------解决思路----------------------
赵老师来个dos命令,一切搞定,哪要这么复杂
@赵4老师
------解决思路----------------------
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
因为本人需要把盘内某种类型的文件都找出来 比如txt jpg avi 。
1 试过在扫描目录时候复制一份路径吧//改成\\然后搜索txt文件 但是有错误 。。从刚得到这个代码然后百度理解 加代码 调试折腾了几天还是没完成 。。
2 这个程序运行后能扫描所有文件 但是打印出来文件的很少 当我换个只包含7个文件的文件夹扫描时都能打印出来 然后再大一点的子目录有打印不出所有文件了 然后试想过是不是&FindFileData内存太小不够放的 。具体怎么回事请大神帮我解答下
3 希望能够以下面的代码为模板修改补充完成 因为这个我折腾了很久想了很多很想学习到底如何让用这个完成 。谢谢了
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;
//可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符
void _find(string path){
//取路径名最后一个"//"之前的部分,包括"//"
string prefix = path.substr(0, path.find_last_of('//') + 1);
WIN32_FIND_DATA FindFileData;
HANDLE hFind = ::FindFirstFile(path.c_str(), &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
cout << "文件通配符错误" << endl;
return;
}
while (TRUE)
{
//目录
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//不是当前目录,也不是父目录
if (FindFileData.cFileName[0] != '.')
{
//查找下一级目录
_find(prefix + FindFileData.cFileName + "//" + "*.*");
}
}
//文件
else
{
cout << FindFileData.cFileName << endl;
}
if (!FindNextFile(hFind, &FindFileData))
break;
}
FindClose(hFind);
}
void main(){
_find("E:");//目录:E盘
_find("E://*.*");//E盘下所有文件
string str = "./test"; //这里指定的是目录
string path;
cout<<"请输入文件通配符:"<<flush;
cin>>path;
str=str+path;
_find((char*)str.c_str());//可以处理".",".." 不可以处理"*","..//*"
_find(str);//可以处理"*","..//*" 不可以处理".",".."
system("pause");
}
------解决思路----------------------
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;
//可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符
void _find(string path)
{
//保存目录名
string prefix = path.substr(0, path.find_last_of('\\') + 1);
//输出要查找的目录的名字
cout << "[目录] " << prefix << endl;
WIN32_FIND_DATA FindFileData;
HANDLE hFind = ::FindFirstFile(path.c_str(), &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
cout << "文件通配符错误" << endl;
return;
}
while (TRUE)
{
//目录
if ( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
//不是当前目录,也不是父目录(.是当前目录 ..是上级目录)
if (FindFileData.cFileName[0] != '.')
{
//查找下一级目录
_find(prefix + FindFileData.cFileName + "\\" + "*.*");
}
}
else
{
cout << "+文件+\t" << FindFileData.cFileName << endl;
}
if(!FindNextFile(hFind, &FindFileData))
break;
}
FindClose(hFind);
}
int main()
{
_find("E:\\*.*"); //E盘下所有文件
string path;
cout<<"请输入路径和文件通配符:例如:(E:\\*.* 或者 abc\\*.* )"<<flush;
cin>>path;
_find(path);
system("pause");
return 0;
}
------解决思路----------------------
赵老师来个dos命令,一切搞定,哪要这么复杂
------解决思路----------------------
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。