TNB Library
TnbFilePathManager.h
[詳解]
1#pragma once
11#ifdef _WIN32_WCE
12 #error TnbFilePathManager.h is only supported on Windows NT Series platforms.
13#endif // _WIN32_WCE
14
15#include "TnbFile.h"
16#include "TnbStrEx.h"
17
18#include <SHLWAPI.h>
19#pragma comment(lib,"SHLWAPI.lib")
20
21
22
23//TNB Library
24namespace TNB
25{
26
27
28
45{
46public:
47
55 static CStr GetPathName(LPCTSTR lpszFullPath)
56 {
57 CStr str = lpszFullPath;
58 INT_PTR p = str.ReverseFindOneOf(_T("\\/"));
59 if ( p >= 0 )
60 {
61 return str.Left(p + 1);
62 }
63 return str;
64 }
65
71 static CStr GetCurrentPath(void)
72 {
73 CStr str;
74 DWORD dwRc = ::GetCurrentDirectory(MAX_PATH, str.GetBuffer(MAX_PATH));
75 str.ReleaseBuffer();
76 ASSERTLIB( dwRc != 0 );
78 return str;
79 }
80
86 : m_strCurrentPath(GetCurrentPath()), m_strManagePath(GetProcessPath())
87 {
88 ::SetCurrentDirectory(m_strManagePath);
89 }
90
96 {
97 ::SetCurrentDirectory(m_strCurrentPath);
98 }
99
105 void ResetPath(bool boIsManagePath = true) const
106 {
107 ::SetCurrentDirectory(m_strCurrentPath);
108 }
109
116 CStr GetPath(void) const
117 {
118 return m_strManagePath;
119 }
120
128 bool SetPath(LPCTSTR lpszPath)
129 {
130 ::Sleep(0);
131 bool boRc = !! ::SetCurrentDirectory(lpszPath);
132 if ( boRc )
133 {
134 m_strManagePath = GetCurrentPath();
135 }
136 return boRc;
137 }
138
146 bool SetPathOfFile(LPCTSTR lpszFile)
147 {
148 return SetPath(GetPathName(lpszFile));
149 }
150
157 CStr GetRelativePathTo(LPCTSTR path) const
158 {
159 if ( IsRelative(path) )
160 {
161 //== 相対パス
162 return path;
163 }
164 //== 絶対パス
165 CStr s;
166 BOOL r = ::PathRelativePathTo(s.GetBuffer(MAX_PATH),
167 GetPath(),
168 FILE_ATTRIBUTE_DIRECTORY,
169 path,
170 FILE_ATTRIBUTE_ARCHIVE);
171 s.ReleaseBuffer();
172 if ( ! r )
173 {
174 s.Empty();
175 }
176 return s;
177 }
178
185 CStr GetCanonicalize(LPCTSTR path) const
186 {
187 if ( ! IsRelative(path) )
188 {
189 //== 絶対パス
190 return path;
191 }
192 //== 相対パスだ
193 CStr s;
194 BOOL r = ::PathCanonicalize(s.GetBuffer(MAX_PATH), GetPath() + _T("\\") + path);
195 s.ReleaseBuffer();
196 if ( ! r )
197 {
198 s.Empty();
199 }
200 return s;
201 }
202
212 CFileReader Open(LPCTSTR lpszFile, LPCTSTR lpszPath = NULL) const
213 {
214 CStr path = lpszPath;
215 CFileReader fileHandle;
216 CStr strFullpath;
217 //
218 loop ( iType, 3 )
219 {
220 if ( iType == 0 || iType == 1 )
221 {
222 //0;指定パス 1;EXEパス から
223 if ( iType == 0 && path.IsEmpty() )
224 {
225 continue;
226 }
227 if ( iType == 1 )
228 {
229 path = GetProcessPath();
230 }
231 //
232 if ( ! ::PathIsRelative(lpszFile) )
233 {
234 //絶対パス
235 continue;
236 }
237 //
238 if ( ! ::PathSearchAndQualify(
239 CStr::Fmt(_T("%s\\%s"), path, lpszFile),
240 strFullpath.GetBuffer(MAX_PATH),
241 MAX_PATH))
242 {
243 continue;
244 }
245 strFullpath.ReleaseBuffer();
246 }
247 else
248 {
249 //パス補完なし
250 strFullpath = lpszFile;
251 }
252 //
253 {
254 TCHAR atcBuf[MAX_PATH];
255 ::GetShortPathName(strFullpath, atcBuf, MAX_PATH);
256 ::GetLongPathName(atcBuf, strFullpath.GetBuffer(MAX_PATH), MAX_PATH);
257 strFullpath.ReleaseBuffer();
258 }
259 //
260 if ( fileHandle.Open(strFullpath, true) )
261 {
262 break;
263 }
264 }
265 return fileHandle;
266 }
267
274 static bool IsRelative(LPCTSTR lpszPath)
275 {
276 return !! ::PathIsRelative(lpszPath);
277 }
278
279private:
280 CStr m_strCurrentPath;
281 CStr m_strManagePath;
282};
283
284
285
286}; // TNB
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ファイル関係のヘッダ
文字列処理関係のヘッダ
ファイルパス管理クラス
void ResetPath(bool boIsManagePath=true) const
[設定] パスリセット.
bool SetPath(LPCTSTR lpszPath)
[設定] 管理パス指定.
static CStr GetCurrentPath(void)
[取得] プロセスのカレントパス取得.
static bool IsRelative(LPCTSTR lpszPath)
[確認] 相対パスチェック
CStr GetCanonicalize(LPCTSTR path) const
[取得] 絶対パス作成.
static CStr GetPathName(LPCTSTR lpszFullPath)
[取得] フォルダ名抽出.
CStr GetRelativePathTo(LPCTSTR path) const
[取得] 相対パス作成.
CFilePathManager(void)
コンストラクタ.
CStr GetPath(void) const
[取得] 管理パス取得 インスタンスで管理しているパスを返します。
bool SetPathOfFile(LPCTSTR lpszFile)
[設定] 管理パス指定.
~CFilePathManager(void)
デストラクタ.
CFileReader Open(LPCTSTR lpszFile, LPCTSTR lpszPath=NULL) const
[操作] ファイルオープン.
ファイル読み込みクラス
Definition: TnbFile.h:338
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boDummy=false)
[操作] オープン
Definition: TnbFile.h:364
INT_PTR ReverseFindOneOf(const TYP *lpsz) const
[確認] 検索(後ろから)
Definition: TnbStr.h:621
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
CStr GetProcessPath(void)
[取得] プロセスのパス取得.
Definition: TnbStrEx.h:57
void IgnoreUnusedValue(const T &value)
[宣言] 参照しない値宣言.
Definition: TnbDef.h:434
TNB Library
Definition: TnbDoxyTitle.txt:2