dcdd144598 2011-02-23 kinaba: #ifndef _KILIB_PATH_H_ dcdd144598 2011-02-23 kinaba: #define _KILIB_PATH_H_ dcdd144598 2011-02-23 kinaba: #include "types.h" dcdd144598 2011-02-23 kinaba: #include "string.h" dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: namespace ki { dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ @pkg ki.StdLib //@} dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // ファイル名処理 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 基本的には文字列ですが、特にファイル名として扱うときに便利な dcdd144598 2011-02-23 kinaba: // クラスです。名前部分のみ取り出しとか拡張子のみ取り出しとか、 dcdd144598 2011-02-23 kinaba: // 属性を取ってくるとか色々。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class Path : public String dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Path() {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 別のPathのコピー //@} dcdd144598 2011-02-23 kinaba: Path( const Path& s ) : String( s ){} dcdd144598 2011-02-23 kinaba: Path( const String& s ) : String( s ){} dcdd144598 2011-02-23 kinaba: Path( const TCHAR* s, long siz=-1 ) : String( s, siz ){} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 単純代入 //@} dcdd144598 2011-02-23 kinaba: Path& operator=( const Path& s ) dcdd144598 2011-02-23 kinaba: { return static_cast<Path&>(String::operator=(s)); } dcdd144598 2011-02-23 kinaba: Path& operator=( const String& s ) dcdd144598 2011-02-23 kinaba: { return static_cast<Path&>(String::operator=(s)); } dcdd144598 2011-02-23 kinaba: Path& operator=( const TCHAR* s ) dcdd144598 2011-02-23 kinaba: { return static_cast<Path&>(String::operator=(s)); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 加算代入 //@} dcdd144598 2011-02-23 kinaba: Path& operator+=( const Path& s ) dcdd144598 2011-02-23 kinaba: { return static_cast<Path&>(String::operator+=(s)); } dcdd144598 2011-02-23 kinaba: Path& operator+=( const String& s ) dcdd144598 2011-02-23 kinaba: { return static_cast<Path&>(String::operator+=(s)); } dcdd144598 2011-02-23 kinaba: Path& operator+=( const TCHAR* s ) dcdd144598 2011-02-23 kinaba: { return static_cast<Path&>(String::operator+=(s)); } dcdd144598 2011-02-23 kinaba: Path& operator+=( TCHAR c ) dcdd144598 2011-02-23 kinaba: { return static_cast<Path&>(String::operator+=(c)); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 特殊パス取得して初期化 //@} dcdd144598 2011-02-23 kinaba: explicit Path( int nPATH, bool bs=true ) dcdd144598 2011-02-23 kinaba: { BeSpecialPath( nPATH, bs ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 特殊パス取得 //@} dcdd144598 2011-02-23 kinaba: Path& BeSpecialPath( int nPATH, bool bs=true ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 特殊パス指定用定数 //@} dcdd144598 2011-02-23 kinaba: enum { Win=0x1787, Sys, Tmp, Exe, Cur, ExeName, dcdd144598 2011-02-23 kinaba: Snd=CSIDL_SENDTO, Dsk=CSIDL_DESKTOPDIRECTORY }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 最後にバックスラッシュを入れる(true)/入れない(false) //@} dcdd144598 2011-02-23 kinaba: Path& BeBackSlash( bool add ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ドライブ名ないしルートのみ //@} dcdd144598 2011-02-23 kinaba: Path& BeDriveOnly(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ディレクトリ名のみ //@} dcdd144598 2011-02-23 kinaba: Path& BeDirOnly(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 短いパス名 //@} dcdd144598 2011-02-23 kinaba: Path& BeShortStyle(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ファイル名だけは確実に長く //@} dcdd144598 2011-02-23 kinaba: Path& BeShortLongStyle(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ...とかを入れて短く //@} dcdd144598 2011-02-23 kinaba: String CompactIfPossible(int Mx); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ディレクトリ情報以外 //@} dcdd144598 2011-02-23 kinaba: const TCHAR* name() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 最後の拡張子 //@} dcdd144598 2011-02-23 kinaba: const TCHAR* ext() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 最初の.以降全部と見なした拡張子 //@} dcdd144598 2011-02-23 kinaba: const TCHAR* ext_all() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ディレクトリ情報と最後の拡張子を除いた名前部分 //@} dcdd144598 2011-02-23 kinaba: Path body() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ディレクトリ情報と最初の.以降全部を除いた名前部分 //@} dcdd144598 2011-02-23 kinaba: Path body_all() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ファイルかどうか //@} dcdd144598 2011-02-23 kinaba: bool isFile() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ディレクトリかどうか //@} dcdd144598 2011-02-23 kinaba: bool isDirectory() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 存在するかどうか。isFile() || isDirectory() //@} dcdd144598 2011-02-23 kinaba: bool exist() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 読み取り専用かどうか //@} dcdd144598 2011-02-23 kinaba: bool isReadOnly() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static const TCHAR* name( const TCHAR* str ); dcdd144598 2011-02-23 kinaba: static const TCHAR* ext( const TCHAR* str ); dcdd144598 2011-02-23 kinaba: static const TCHAR* ext_all( const TCHAR* str ); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool Path::isFile() const dcdd144598 2011-02-23 kinaba: { return 0==(::GetFileAttributes(c_str())&FILE_ATTRIBUTE_DIRECTORY); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool Path::isDirectory() const dcdd144598 2011-02-23 kinaba: { DWORD x=::GetFileAttributes(c_str()); dcdd144598 2011-02-23 kinaba: return x!=0xffffffff && (x&FILE_ATTRIBUTE_DIRECTORY)!=0; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool Path::exist() const dcdd144598 2011-02-23 kinaba: { return 0xffffffff != ::GetFileAttributes(c_str()); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool Path::isReadOnly() const dcdd144598 2011-02-23 kinaba: { DWORD x=::GetFileAttributes(c_str()); dcdd144598 2011-02-23 kinaba: return x!=0xffffffff && (x&FILE_ATTRIBUTE_READONLY)!=0; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline const TCHAR* Path::name() const dcdd144598 2011-02-23 kinaba: { return name(c_str()); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline const TCHAR* Path::ext() const dcdd144598 2011-02-23 kinaba: { return ext(c_str()); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline const TCHAR* Path::ext_all() const dcdd144598 2011-02-23 kinaba: { return ext_all(c_str()); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: } // namespace ki dcdd144598 2011-02-23 kinaba: #endif // _KILIB_PATH_H_