Linux文件系统函数调用案例

刚学C++时老师布置的一个实验作业。

#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
using namespace std;

vector<string> split_str(string s);
class fileOperate
{
public:
    int md(string name){
                    mode_t mode = 0775;
                if(mkdir(name.c_str(), mode)==0)
                {

                    cout<<"创建文件夹‘"<<name<<"’成功"<<endl;
                    return 0;
                }
                else
                {
                    cout<<"error: 创建文件夹‘"<<name<<"’失败。"<<endl;
                    return -1;
                }

    }
    int del(string fileName){
        if(remove(fileName.c_str()) == 0 )
        {
            cout<<"删除文件‘"<<fileName<<"’成功"<<endl;
            return 0;
        }
        else
        {
            cout<<"error: 删除文件‘"<<fileName<<"’失败。"<<endl;
            return -1;
        }   

    }
    int cd(string path){
        return chdir(path.c_str())==0? 0 : -1;
    }
    void ls(){
            //列出文件夹内容
            DIR * curDir;
            struct dirent *ent;
            struct stat entStat;
            if((curDir=opendir("."))==NULL)
            {
                cout<<"error: 打开当前文件夹失败。"<<endl;
            }
            else
            {
                while((ent=readdir(curDir))!=NULL)//遍历该文件目录下的内容
                {               
                    if(stat(ent->d_name, &entStat) == 0)
                    {
                        if(entStat.st_mode & S_IFDIR)//判断是否是文件夹
                        {
                            cout<<setw(6)<<left<<"d";
                            cout<<right<<setw(10)<<entStat.st_size<<left<<setw(8)<<" bytes";
                            cout<<left<<setw(8)<<entStat.st_mode;
                            cout<<left<<setw(12)<<entStat.st_atime;
                            cout<<ent->d_name<<"/"<<endl;

                        }
                        else if(entStat.st_mode & S_IFREG)
                        {
                            cout<<setw(6)<<left<<"-";
                            cout<<right<<setw(10)<<entStat.st_size<<left<<setw(8)<<" bytes";
                            cout<<left<<setw(8)<<entStat.st_mode;
                            cout<<left<<setw(12)<<entStat.st_atime;
                            cout<<ent->d_name<<endl;
                        }                       
                    }                   
                }
                closedir(curDir);
            }

    }
    int cp(string oldfile,string oldfilePath,string newfilePath){//深度拷贝
        struct dirent *ent;
        struct stat entStat,entStat2;
        cd(oldfilePath);
        if( stat(oldfile.c_str(),&entStat)==0){
            if(entStat.st_mode & S_IFDIR){
                cd(newfilePath);
                if(md(oldfile)==0){
                    DIR * curDir;
                    cd(oldfilePath);
                    cd(oldfile);
                    curDir=opendir(".");
                        while((ent=readdir(curDir))!=NULL)
                        {
                            if(stat(ent->d_name, &entStat2) == 0)
                            {
                                    if(ent->d_name[0]!='.'){//跳过本身和复文件
                                        string newpath=newfilePath+'/'+oldfile;
                                        string oldpath=oldfilePath+'/'+oldfile;
                                        cp(ent->d_name,oldpath,newpath);
                                        cd(oldfilePath);
                                        cd(oldfile);
                                    }
                            }
                        }
                    closedir(curDir);
                    cd("..");
                }else
                    return -1;
            }else{
                cd(oldfilePath);
                ifstream file(oldfile.c_str(),ios::binary);
                if(!file){
                    cout<<"打开文件失败,无法复制"<<endl;
                    return -1;
                }
                cd(newfilePath);
                ofstream file2(oldfile.c_str(),ios::binary);
                if(!file2){
                    cout<<"不能创建新文件,复制失败"<<endl;
                    return -1;
                }
                file2<<file.rdbuf();
                file.close();
                file2.close();
                return 0;
            }
        }
        return 0;
    }

};

vector<string> split_str(string s)//处理输入指令
{
    vector<string> tokens;  
    istringstream iss(s);//以空格为分割符号,把该行分割开
    do
    {
        string sub;
        iss >> sub;
        tokens.push_back(sub);
    } while (iss);

    tokens.erase(tokens.end()-1); // 删除最后的换行回车符
    return tokens;
}

int main()
{   
    fileOperate operate;
    cout<<"=============================================="<<endl;
    cout<<"命令格式: ? xx1 xx2 …… xxN"<<endl;
    cout<<"   md  创建文件夹       del  删除文件夹/文件夹"<<endl;
    cout<<"   cd  改变当前文件夹   ls  列出文件夹内容"<<endl;
    cout<<"   cp  复制文件/文件夹  q   退出\n"<<endl;
    cout<<"请输入";
    string commandLine;
    vector<string> commandArgs;
    getline(cin,commandLine);   
    commandArgs=split_str(commandLine);
    while(commandArgs.size()>0 && "q"!=commandArgs[0])//按回车或者输入q都能退出程序
    {
    if(commandArgs[0]=="cd"){
                if(commandArgs.size()<2)
                    cout<<"请输入文件夹名字"<<endl;
                else{
                    if(operate.cd(commandArgs[1])==0){
                        cout<<"切换成功"<<endl;
                    }else
                        cout<<"切换失败"<<endl;
                }
    }else if(commandArgs[0]=="md"){
        if(commandArgs.size()<2)
            cout<<"请输入文件夹名字"<<endl;
        else
        operate.md(commandArgs[1]);
    }else if(commandArgs[0]=="ls"){
                operate.ls();
    }else if(commandArgs[0]=="del"){
        if(commandArgs.size()<2){
            cout<<"请输入文件夹名称"<<endl;
        }else{
            cout<<commandArgs[1]<<endl;
            if(operate.del(commandArgs[1])==0){
                cout<<"删除成功"<<endl;
            }else{
                cout<<"删除文件夹失败"<<endl;
            }
        }
    }else if(commandArgs[0]=="cp"){
        if(commandArgs.size()!=4){
            cout<<"请以这个格式输入/“ cp 源文件名称 源文件路径 目标文件夹名称/”"<<endl;
        }else{
            if(operate.cp(commandArgs[1],commandArgs[2],commandArgs[3])==0)
                cout<<"复制成功"<<endl;
            else
                cout<<"复制失败"<<endl;
        }
    }
    cout<<"?";//执行玩任务,继续让用户输入指令
    getline(cin,commandLine);   
    commandArgs=split_str(commandLine);
    }
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值