TNB Library
TnbCabfileArchiver.h
[詳解]
1#pragma once
13#include "TnbDeepFileFinder.h"
14#include "TnbSet.h"
15#include "TnbMap.h"
16#include "TnbFileName.h"
17#include "TnbProcessHandle.h"
18#include "TnbStrAdder.h"
20#include "TnbFilePathManager.h"
21
22
23
24//TNB Library
25namespace TNB
26{
27
28
29
48{
49public:
50
57 void AddSourceDirectory(LPCTSTR lpszPath, LPCTSTR lpszCabPath = NULL)
58 {
59 CMyFinder f(&m_map, lpszCabPath);
60 f.Execute(lpszPath);
61 }
62
71 bool AddSourceFile(LPCTSTR lpszFileName, LPCTSTR lpszCabPath = NULL)
72 {
73 CFileName fn = lpszFileName;
74 if ( fn.IsExist() )
75 {
76 CStr s = lpszCabPath;
77 m_map[s].Insert(fn.GetFullName());
78 return true;
79 }
80 return false;
81 }
82
87 void RemoveAll(void)
88 {
89 m_map.RemoveAll();
90 }
91
99 bool Attract(LPCTSTR lpszCabFileName)
100 {
101 CStrAdder sa;
102 loop ( i, m_map )
103 {
104 CStr cabPath = m_map.At(i).first;
105 const CSingleSetT<CStr>& v = m_map.At(i).second;
106 if ( v.GetSize() > 0 )
107 {
108 sa.AddFormat(_T(".Set DestinationDir=\"%s\"\r\n"), cabPath);
109 loop ( j, v )
110 {
111 sa.AddFormat(_T("\"%s\"\r\n"), v[j]);
112 }
113 }
114 }
115 CAscii a = CStr(sa);
116 LPCSTR lpsz = a;
117 CTemporaryFile temp;
118 CTemporaryDirectory tempDir;
119 CStr pt = tempDir.Create();
120 CStr fn = temp.Create();
121 if ( CFileWriter::NewFile(fn, a.GetLength(), lpsz) )
122 {
124 ::SetCurrentDirectory(pt);
125 CStr cl;
126 cl.Format(_T("makecab /F \"%s\""), fn);
128 if ( ph.Create(NULL, cl, false) )
129 {
130 ph.WaitForExit();
131 CFileName fn = pt + _T("\\disk1\\1.cab");
132 return fn.CopyTo(lpszCabFileName);
133 }
134 }
135 return false;
136 }
137
146 static bool Extract(LPCTSTR lpszPath, LPCTSTR lpszCabFileName)
147 {
148 CFileName fn = lpszPath;
149 fn.MakeDirectory();
150 CStr cl;
151 cl.Format(_T("expand \"%s\" -F:* \"%s\""), lpszCabFileName, lpszPath);
153 if ( ph.Create(NULL, cl, false) )
154 {
155 ph.WaitForExit();
156 return ph.GetExitCode() == 0;
157 }
158 return false;
159 }
160
161private:
163 class CMyFinder : public CDeepFileFinder
164 {
166 CStr m_cabPath;
167 public:
168 CMyFinder(CMapT< CStr, CSingleSetT<CStr> >* p, LPCTSTR lpszCabPath) : m_pMap(p), m_cabPath(lpszCabPath)
169 {
170 }
171 protected:
172 // [通知] ファイル発見通知.
173 virtual void OnFoundFile(LPCTSTR lpszFoundName, const WIN32_FIND_DATA& data, int depth)
174 {
175 CFileName fn = lpszFoundName;
176 CFileName path = fn.GetPathName();
177 CStr cp = m_cabPath;
178 if ( depth > 1 )
179 {
180 CStr ex;
181 loop ( i, depth - 1 )
182 {
183 if ( ex.IsEmpty() )
184 {
185 ex = path.GetFileName();
186 }
187 else
188 {
189 ex = path.GetFileName() + _T("\\") + ex;
190 }
191 path = path.GetPathName();
192 }
193 if ( cp.IsEmpty() )
194 {
195 cp = ex;
196 }
197 else
198 {
199 cp = cp + _T("\\") + ex;
200 }
201 }
202 (*m_pMap)[cp].Insert(fn.GetFullName());
203 }
204 };
206};
207
208
209
210}; // TNB
ファイル検索関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ファイルネーム関係のヘッダ
ファイルパス関係のヘッダ
マップ型情報管理関係のヘッダ
プロセスハンドル管理ヘッダ
シングルセット情報管理関係のヘッダ
文字列連結関係のヘッダ
テンポラリディレクトリ関係のヘッダ
CABファイルアーカイバー
void RemoveAll(void)
[削除] 削除.
bool AddSourceFile(LPCTSTR lpszFileName, LPCTSTR lpszCabPath=NULL)
[設定] ソースファイル追加.
static bool Extract(LPCTSTR lpszPath, LPCTSTR lpszCabFileName)
[作成] 解凍.
bool Attract(LPCTSTR lpszCabFileName)
[作成] 格納.
void AddSourceDirectory(LPCTSTR lpszPath, LPCTSTR lpszCabPath=NULL)
[設定] ソースディレクトリ追加.
ディープファイル検索クラス
ファイル名管理クラス
Definition: TnbFileName.h:59
bool CopyTo(LPCTSTR lpszNew, bool boIsAllowUndo=false, bool boIsSilent=true)
[操作] コピー.
Definition: TnbFileName.h:714
bool IsExist(void) const
[確認] 有無チェック
Definition: TnbFileName.h:455
CStr GetPathName(void) const
[取得] パス取得
Definition: TnbFileName.h:269
CStr GetFullName(void) const
[取得] フルName名取得
Definition: TnbFileName.h:184
bool MakeDirectory(void)
[作成] フォルダ作成.
Definition: TnbFileName.h:628
CStr GetFileName(void) const
[取得] ファイル名取得
Definition: TnbFileName.h:209
ファイルパス管理クラス
static bool NewFile(LPCTSTR lpszFileName, size_t size, LPCVOID P, CFileWriter &fw=CFileWriter())
[保存] ファイル作成.
Definition: TnbFile.h:653
マップ型情報管理テンプレート
Definition: TnbMap.h:66
プロセスハンドル管理クラス
LONGLONG GetExitCode(void) const
[取得] プロセス終了コード取得
bool Create(LPCTSTR lpszExecName, LPCTSTR lpszCommand, STARTUPINFO &si)
[実行] プロセス実行
DWORD WaitForExit(DWORD dwWait=INFINITE)
[処理] 終了待ち.
シングルセット情報管理テンプレート
Definition: TnbSet.h:71
virtual size_t GetSize(void) const
[取得] 要素数取得.
Definition: TnbSet.h:142
文字列連結専門管理
Definition: TnbStrAdder.h:33
int AddFormat(size_t len, LPCTSTR lpszFmt,...)
[追加] 文字列追加.
Definition: TnbStrAdder.h:108
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
void Insert(INDEX index, const TYP *lpText)
[挿入] 文字列挿入
Definition: TnbStr.h:406
size_t GetLength(void) const
[取得] 文字列長
Definition: TnbStr.h:518
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
Definition: TnbStr.h:359
テンポラリディレクトリ管理テンプレートクラス
CStr Create(void)
[操作] 作成.
CStr Create(void)
[操作] 作成.
TNB::CStrT< TCHAR > CStr
文字列クラス
Definition: TnbStr.h:1785
TNB Library
Definition: TnbDoxyTitle.txt:2