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