#include<iostream>
#include<cstring>
#include<fstream>
#include<windows.h>
#include<direct.h>
using namespace std;
class Dos//dos命令
{
public:
void Move(string file,string other);//移动文件位置
void Copy(string file,string other);//复制文件位置
void Dls(string name);//删除文件夹
void DelFile(string name);//删除指定路径的文件
void DelAll();//删除当前路径的文件
bool FileSum(string S);//判断是否文件夹是否为空
void DelEmpty();//删除空文件夹
void DelJpg();//删除当前路径的JPG文件
void Cd(string path);//指定为当前路径
void Cd();//指定当前路径为上一层路径
void Dir();//获取当前路径下的所有文件夹和文件信息
};
class Work//开始执行
{
public:
void solve();//执行
};
void Dos:: Move(string file,string other)//移动文件
{
char filename[MAX_PATH];
char otherfile[MAX_PATH];
for(int i=0;i<=file.size();i++)//获取文件的路径信息
{
filename[i]=file[i];
}
for(int i=0;i<=other.size();i++)//获取文件的路径信息
{
otherfile[i]=other[i];
}
MoveFile(filename, otherfile);//移动,用MoveFile
}
void Dos::Copy(string file,string other)//复制文件
{
char filename[MAX_PATH];
char otherfile[MAX_PATH];
for(int i=0;i<=file.size();i++)//获取文件的路径信息
{
filename[i]=file[i];
}
for(int i=0;i<=other.size();i++)//获取文件的路径信息
{
otherfile[i]=other[i];
}
CopyFile(filename, otherfile,false);//复制文件,从fie到other
}
void Dos:: Dls(string name)//删除非空文件
{
char filename[MAX_PATH];
for(int i=0;i<=name.size();i++)//获取文件的路径信息
{
filename[i]=name[i];
}
strcpy(filename,"\\*.*");//仿照dir获取它内部的文件信息,递归删除 文件,使他为空,最后利用removedirectory删除
WIN32_FIND_DATA findFileData;
HANDLE hFindFile=FindFirstFile(filename,&findFileData);
do
{
string s=findFileData.cFileName;
char road[MAX_PATH];
cout<<road<<endl;
for(int i=0;i<=s.size();i++)//获取文件的路径信息
{
road[i]=s[i];
}
if(findFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)//文件夹删除
{
RemoveDirectory(road);
}
else//文件删除
{
DeleteFile(road);//传路径
}
}while(FindNextFile(hFindFile,&findFileData)!=0);//递归查找删除
FindClose(hFindFile);
cout<<endl<<endl;
RemoveDirectory(filename);//删除非空文件
}
void Dos:: DelAll()//删除所有文件当前路径
{
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
cout<<path<<endl<<endl;
strcat(path,"\\*.*");//仿照dir获取所有文件,然后一一删除
WIN32_FIND_DATA findFileData;
HANDLE hFindFile=FindFirstFile(path,&findFileData);
do
{
string s=findFileData.cFileName;
char road[MAX_PATH];
for(int i=0;i<=s.size();i++)//获取文件的路径信息
{
road[i]=s[i];
}
DeleteFile(road);
}while(FindNextFile(hFindFile,&findFileData)!=0);//递归查找删除
FindClose(hFindFile);
cout<<endl<<endl;
}
void Dos::DelFile(string name)//删除指定路径文件
{
char filename[MAX_PATH];
for(int i=0;i<=name.size();i++)//获取文件的路径信息
{
filename[i]=name[i];
}
cout<<filename;
DeleteFile(filename);//删除文件
}
bool Dos::FileSum(string S)//判断文件夹是否为空
{
Cd(S);
int sum=0,cnt=0;
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
strcat(path,"\\*.*");
WIN32_FIND_DATA findFileData;
HANDLE hFindFile=FindFirstFile(path,&findFileData);
do
{
string s=findFileData.cFileName;
if(s==".."&&s==".")//即根据.和..来判断,只有这两个的话,总和就是2,
{
sum++;
}
else
{
cnt++;
}
}while(FindNextFile(hFindFile,&findFileData)!=0);
FindClose(hFindFile);
return sum+cnt>2;//》2就是有文件,反之没有
}
void Dos:: DelEmpty()//删除空文件夹
{
char path[MAX_PATH];
string road;
GetCurrentDirectory(MAX_PATH,path);//获取当前路径
strcat(path,"\\*.*");
WIN32_FIND_DATA findFileData;
HANDLE hFindFile=FindFirstFile(path,&findFileData);
do//遍历查找,那个文件为空,
{
if(findFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)//表示为文件
{
string s=findFileData.cFileName;
char Road[MAX_PATH];
if(s!=".."&&s!=".")//此时判断为文件
{
for(int i=0;i<s.length();i++)//获取文件的路径信息
{
if(s[i]=='\\')
{
Road[i]='/';
}
else
{
Road[i]=s[i];
}
}
if(!FileSum(s))//判断
{
RemoveDirectory(Road);//删除
Cd();//返回上一级信息 ,因为前面是在下一级
}
}
}
}while(FindNextFile(hFindFile,&findFileData)!=0);
FindClose(hFindFile);
cout<<endl<<endl;
}
void Dos::DelJpg()//删除全部jpg文件
{
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
cout<<path<<endl<<endl;
strcat(path,"\\*.*");
WIN32_FIND_DATA findFileData;
HANDLE hFindFile=FindFirstFile(path,&findFileData);
do//遍历查找jpg文件
{
string s=findFileData.cFileName;
if(s.rfind(".jpg")!=-1)
{
char road[MAX_PATH];
cout<<s<<endl;
for(int i=0;i<s.length();i++)//获取文件的路径信息
{
road[i]=s[i];
}
DeleteFile(road);//删除文件
}
}while(FindNextFile(hFindFile,&findFileData)!=0);
FindClose(hFindFile);
cout<<endl<<endl;
}
void Dos:: Cd(string path)//指定当前路径为上一级路径
{
char road[MAX_PATH];
SetCurrentDirectory(path.c_str());//设置当前路径
GetCurrentDirectory(MAX_PATH,road);//获取当前路径
cout<<road<<endl<<endl;
}
void Dos::Cd()//返回上一级路径
{
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);//获取当前路径
string a;
a.assign(path);
a.append("\\..\\");//转换
SetCurrentDirectory(a.c_str());//设置当前路径为之前的上一级路径
GetCurrentDirectory(MAX_PATH,path);//获取现在的路径
cout<<path<<endl<<endl;
}
void Dos::Dir()//输出文件和文件夹的信息
{
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
cout<<path<<endl<<endl;
strcat(path,"\\*.*");
WIN32_FIND_DATA findFileData;
HANDLE hFindFile=FindFirstFile(path,&findFileData);
do//遍历查找
{
if(findFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
cout<<"文件夹:"<<findFileData.cFileName<<endl;
}
else
{
cout<<"文件: "<<findFileData.cFileName<<endl;
}
}while(FindNextFile(hFindFile,&findFileData)!=0);
FindClose(hFindFile);
cout<<endl<<endl;
}
void Work::solve()
{
while (1)
{
Dos dos;
string command, object, other;
cin >> command;
if (command == "dir")
{
dos.Dir();
}
else if(command=="cd.." )
{
dos.Cd();
}
else if (command == "cd" ||command == "del" || command == "del/s")
{
cin >> object;
if(command=="cd")
{
dos.Cd(object);
}
else if(command=="del"&&object=="*.jpg")
{
dos.DelJpg();
}
else if(command=="del"&&object=="*.*")
{
dos.DelAll();
}
else if(command=="del"&&object.rfind(".")!=-1)//删除空文件
{
dos.DelEmpty();
}
else if(command=="del"&&object.rfind(".")==-1)//删除指定文件
{
dos.DelFile(object);
}
else if(command=="del/s")//删处指定文件夹
{
dos.Dls(object);
}
}
else if (command == "copy"||command=="move")
{
cin >> object >> other;
if (command == "copy")//复制
{
dos.Copy(object,other);
}
else if(command=="move")//移动
{
dos.Move(object,other);
}
}
else if (command == "exit")//退出
{
exit(1);//退出
}
}
}
int main()
{
Work work;
work.solve();
return 0;
}
欢迎指正