资源简介
目标:为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
- 上一篇:中英文北京地铁线路图全矢量图
- 下一篇:2018年国际会议列表人工智能大类
相关资源
- nagle算法的pdf文档
- verilog设计2倍频
- mxgraph中右键和toolbar工具条的实现
- 自己编写的xilix ddr3 IP核用户接口ver
- 在cygwin系统运行SLEUTH
- 软件缺陷跟踪系统
- 国网376.1-2009、376.1-2013主站与采集终端
- PNG图片.rar
- nGui.rar
- QGraphicsPixmapItem与QGraphicsScene的编程 图
- pb数据窗口美化(grid线条颜色/字体垂
- Cocos2d-x 3.2 自动更新 -- 使用AssetsMana
- 香橙派orangepi的GPIO接口wiringOP_zero
- GBK字模生成工具16*16
- gtk背景图片设置
- ThreeJs开发移动,旋转,相机,纹理,
- JTAG的封装库及演示
- codebook_generator and precoding
- 匹配滤波器Verilog代码
- 尚硅谷SpringBoot视频 ,百度网盘分享链
- 用FPGA实现OFDM调制解调
- QT opengl 绘制立体图形
- glut 各种库
- fpga实现pci配置空间的读写
- GPS信号捕获仿真
- 双馈风电机组低电压穿越PSCAD仿真
- 2.45GHz矩形微带贴片天线仿真
- SpringCloud基于SpringBoot 分布式服务实现
- 用FPGA实现的正交解码计数器
- verilog写的基于状态机的自动售货机
评论
共有 条评论