• 大小: 363KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-09
  • 语言: 其他
  • 标签: Unix命令  g++  跨平台  

资源简介

目标:为Windows操作系统建立一个兼容Unix命令的命令接口,实现命令包括ls,cat,cp,mv,md,rd,cd,sort,more命令。 环境:使用CodeBlock开发(g++编译) 效果:尚未发现BUG 优点:代码可读性高、比较精简、错误处理完善,经测试,略微改动几行代码可在mac-lion-10.8(苹果系统,其实也是unix)上运行 展望:其实开发命令行接口,使用getopt()等函数是比较方便的,但这是作者开发到一半的时间才知道的事情,所以未能及时更换开发方法,希望有缘人能弥补这一缺憾。

资源截图

代码片段和文件信息

#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 

#include “Command.h“

using namespace std;

#define PATH_BUF 256
#define FILE_BUF 4096

char path[PATH_BUF]={0};

void print_path()
{
    if (getcwd(path PATH_BUF)) {
        cout << path << “>“;
    } else {
        cout << “Error: Cannot get current path\n“;
        exit(1);
    }
}

void CAT(int argc char *argv[])
{
    char buf[FILE_BUF]={0};

    try {
        if (1 == argc) {
            cerr << “Error: Do not specify any file.\n“;
            return;
        } else if (2 == argc) {

            if (0 == strcmp(argv[1] “--help“)) {
                cout << “Usage: cat [--help]/[file]/[file1 file2]\n“;
                cout << “View file or catenate files.\n“;
                return;
            } else {

                char *filename=argv[1];
                ifstream in(filename);
                if (!in) throw errno;

                do{
                    in.read(buf FILE_BUF-1);
                    buf[in.gcount()]=‘\0‘;
                    cout << buf;
                }while(in.gcount() > 0);
                cout << “\n“;

                in.close();
            }
            return;
        } else if (3 == argc) {
            char *source=argv[1];
            char *dest=argv[2];

            ifstream in(source ifstream::binary);
            if (!in) throw errno;

            ofstream out(dest ofstream::binary | ofstream::app);
            if (!out) throw errno;

            do{
                in.read(buf FILE_BUF);
                out.write(buf in.gcount());
            }while(in.gcount() > 0);

            in.close();
            out.close();
        } else {
            cerr << “Error: Too many options typed.\n“;
            return;
        }

    } catch (int err) {
        cerr << “Error: “ << strerror(err) << endl;
        return;
    }
}

void CD(int argc char *argv[])
{
    char *dirname=NULL;

    if (1 == argc) {
        cerr << “Error: Do not specify any file.\n“;
        return;
    } else if (2 == argc) {
        if (0 == strcmp(argv[1] “--help“)) {
            cout << “Usage: cd [--help]/[file]\n“;
            cout << “Change the shell working directory.\n“;
            return;
        } else {
            dirname = argv[1];
            if ((-1 == access(dirname 0)) || (0 != chdir(dirname)))
                cerr << “Error: “ << strerror(errno) << “\n“;
            else {
                if (!getcwd(path PATH_BUF))
                    cerr << “Error: Cannot get current path.\n“;
            }
        }
    } else {
        cerr << “Error: Too many options typed.\n“;
        return;
    }
}

void CP(int argc char *argv[])
{
    if (1 == argc) {
        cerr << “Error: Do not specify any files.\n“;
        return;
    } else if (2 == argc) {

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2013-07-04 18:40  all\
     文件        1272  2013-06-29 16:08  all\all.cbp
     文件         466  2013-07-03 21:52  all\all.depend
     文件         691  2013-07-04 18:40  all\all.layout
     目录           0  2013-07-04 18:31  all\bin\
     目录           0  2013-07-04 18:40  all\bin\Debug\
     文件     1142601  2013-07-04 18:40  all\bin\Debug\all.exe
     文件        9921  2013-07-03 21:50  all\Command.cpp
     文件         834  2013-07-03 21:52  all\Command.h
     文件          24  2013-06-21 15:57  all\icon.rc
     文件        2806  2013-07-04 18:40  all\main.cpp
     目录           0  2013-07-04 18:31  all\obj\
     目录           0  2013-07-04 18:40  all\obj\Debug\
     文件      223566  2013-07-04 18:31  all\obj\Debug\Command.o
     文件        3150  2013-07-04 18:31  all\obj\Debug\icon.res
     文件       15053  2013-07-04 18:40  all\obj\Debug\main.o
     文件        2870  2013-06-21 15:55  all\UNIX.ico

评论

共有 条评论