Posted on 2008-12-14 21:29
Condor 阅读(1180)
评论(0) 编辑 收藏 引用
上一次熟悉了IO系统后, 写个程序来练练手.
正好这次看到App命名空间, 正好熟悉一下ConsoleApplication的用法. 因为Nebula3内置了ZipFileSystem, 但不支持压缩, 只支持解压缩, 就试着写了一个命令行的unzip.exe, 算是对之前所学的一个总结.
没想解压缩就像拷贝文件一样简单! 因为当zip文件挂载到IO系统后, 可以像本地文件一样使用其中的文件, 呵呵.
1: /********************************************************************
2: created: 2008/07/08
3: created: 8:7:2008 16:15
4: filename: UnZip.cpp
5: author: xoyojank
6:
7: purpose: zip file extract test
8: *********************************************************************/
9:
10: #include "stdneb.h"
11: #include "UnZipApp.h"
12:
13: using namespace Util;
14:
15: //------------------------------------------------------------------------------
16: /**
17: */
18: void __cdecl
19: main(int argc, const char** argv)
20: {
21: CmdLineArgs args(argc, argv);
22: UnZipApp app;
23: app.SetCompanyName("Xoyojank");
24: app.SetAppName("UnZip");
25: app.SetCmdLineArgs(args);
26: if (app.Open())
27: {
28: app.Run();
29: app.Close();
30: }
31: system("pause");
32: app.Exit();
33: }
1: /********************************************************************
2: created: 2008/07/08
3: created: 8:7:2008 16:16
4: filename: UnZipApp.h
5: author: xoyojank
6:
7: purpose: UnZip Application
8: *********************************************************************/
9: #pragma once
10: #include "stdneb.h"
11: #include "app/consoleapplication.h"
12:
13: class UnZipApp : public App::ConsoleApplication
14: {
15: public:
16: UnZipApp(void);
17:
18: /// open the application
19: virtual bool Open();
20: /// run the application, return when user wants to exit
21: virtual void Run();
22:
23: private:
24: /// a recursion method to unzip the files under "dir"
25: void UnZipDir(Util::String& dir);
26: private:
27: Util::String zipFileName;
28: Util::String sourcePath;
29: Util::String targetPath;
30: };
1: /********************************************************************
2: created: 2008/07/08
3: created: 8:7:2008 16:19
4: filename: UnZipApp.cpp
5: author: xoyojank
6:
7: purpose: UnZip Application
8: *********************************************************************/
9: #include "UnZipApp.h"
10:
11:
12: UnZipApp::UnZipApp(void)
13: {
14: }
15:
16: bool UnZipApp::Open()
17: {
18: if (ConsoleApplication::Open())
19: {
20: // help info
21: if (this->args.HasArg("-help"))
22: {
23: n_printf("-file: the .zip file to unzip.\n");
24: n_printf("-path: where are the files unzip to, if this args is omitted, the file will be unzip into current directory.\n");
25: return false;
26: }
27:
28: Util::String zipFile;
29: zipFile = this->args.GetString("-file");
30: // current .exe directory
31: this->sourcePath = Util::String("bin:") + zipFile;
32: bool fileValid = this->ioServer->MountZipArchive(this->sourcePath);
33: if (!fileValid)
34: {
35: // absolute path
36: this->sourcePath = Util::String("file:///") + zipFile;
37: fileValid = this->ioServer->MountZipArchive(this->sourcePath);
38: if (!fileValid)
39: {
40: n_error("Cannot open zip file.\n");
41: return false;
42: }
43: }
44: this->zipFileName = zipFile.ExtractFileName();
45: this->zipFileName.StripFileExtension();
46: this->sourcePath = this->sourcePath.ExtractDirName() + "/";
47:
48: // target directory
49: this->targetPath = this->args.GetString("-path");
50: if (this->targetPath.Length() <= 1 || this->targetPath[1] != ':')
51: {// relative path
52: this->targetPath = Util::String("bin:") + this->targetPath;
53: }
54: else
55: {// absolute path
56: this->targetPath = Util::String("file:///") + this->targetPath;
57: }
58: this->targetPath += "/";
59: if (this->sourcePath == this->targetPath)
60: {
61: n_printf("the source diretory cannot be the same with the destination!");
62: return false;
63: }
64: return true;
65: }
66: return false;
67: }
68:
69: void UnZipApp::Run()
70: {
71: UnZipDir(this->zipFileName);
72: }
73:
74: void UnZipApp::UnZipDir( Util::String& dir )
75: {
76: // create a new directory
77: this->ioServer->CreateDirectory(this->targetPath + dir);
78: // unzip the files in this directory
79: Util::Array<Util::String> listFile = this->ioServer->ListFiles(this->sourcePath + dir, "*");
80: for (IndexT i = 0; i < listFile.Size(); i++)
81: {
82: Util::String curFile = this->targetPath + dir + "/" + listFile[i];
83: this->ioServer->CopyFile(this->sourcePath + dir + "/" + listFile[i], curFile);
84: n_printf("%s\n", curFile.AsCharPtr());
85: }
86: // unzip the sub directories
87: Util::Array<Util::String> listDir = this->ioServer->ListDirectories(this->sourcePath + dir, "*");
88: for (IndexT i = 0; i < listDir.Size(); i++)
89: {
90: Util::String curDir = dir + "/" + listDir[i];
91: n_printf("%s\n", (this->targetPath + curDir).AsCharPtr());
92: UnZipDir(curDir);
93: }
94: }
调试参数:
运行结果: