Frost Moon Project

Src/Path.cpp-Ashley Ver.1.30- - Frost Moon Project アクセスランキング

Home > ソフトウェア > Ashley > Ashley130.zip/Ashley130.exe > Src > Path.cpp

//Path.cpp
//パス操作関数

/*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
    Ashley Ver.1.30
    Coded by x@rgs

    This code is released under NYSL Version 0.9982
    See NYSL_withfaq.TXT for further details.

    Ashleyは、アップローダからダウンロードしたZIPやRAR等のファイル名を元に戻すソフトです。
#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/


#include"Pch.h"
#include"Path.h"

#ifdef __cplusplus
namespace path{
#endif

//文字列から文字を検索し、その最初の位置を返す
int LocateFirstCharacter(const TCHAR* pszStr,int iChar){
    int i=0,iResult=-1;

    for(i=0;pszStr[i]!=_T('\0');++i){
        #ifndef UNICODE
            if(IsDBCSLeadByte(pszStr[i])){
                ++i;
                continue;
            }
        #endif
        if(pszStr[i]==iChar){iResult=i;break;}
    }
return iResult;
}

//文字列から文字を検索し、その最後の位置を返す
int LocateLastCharacter(const TCHAR* pszStr,int iChar){
    int i=0,iResult=-1;

    for(i=0;pszStr[i]!=_T('\0');++i){
        #ifndef UNICODE
            if(IsDBCSLeadByte(pszStr[i])){
                ++i;
                continue;
            }
        #endif
        if(pszStr[i]==iChar)iResult=i;
    }
return iResult;
}

//文字列から文字を検索し、その個数を返す
int CountCharacter(const TCHAR* pszStr,int iChar){
    int i=0,iResult=0;

    for(i=0;pszStr[i]!=_T('\0');++i){
        #ifndef UNICODE
            if(IsDBCSLeadByte(pszStr[i])){
                ++i;
                continue;
            }
        #endif
        if(pszStr[i]==iChar)iResult++;
    }
return iResult;
}

//ファイル名に使えない文字が含まれるかどうか
bool IsBadName(TCHAR* pszFileName){
    if(path::LocateLastCharacter(pszFileName,'\\')!=-1||
        path::LocateLastCharacter(pszFileName,'/')!=-1||
        path::LocateLastCharacter(pszFileName,':')!=-1||
//        path::LocateLastCharacter(pszFileName,',')!=-1||
//        path::LocateLastCharacter(pszFileName,';')!=-1||
        path::LocateLastCharacter(pszFileName,'*')!=-1||
        path::LocateLastCharacter(pszFileName,'?')!=-1||
        path::LocateLastCharacter(pszFileName,'\"')!=-1||
        path::LocateLastCharacter(pszFileName,'<')!=-1||
        path::LocateLastCharacter(pszFileName,'>')!=-1||
        path::LocateLastCharacter(pszFileName,'|')!=-1)return true;
    else return false;
}

//末尾にスラッシュ/バックスラッシュを追加
bool AddBackSlash(TCHAR* pszResult,const TCHAR* pszPath){
    int iPosition=-1;
    bool bResult=false,bSlash=false;

    iPosition=LocateLastCharacter(pszPath,_T('\\'));
    if(iPosition==-1){
        bSlash=true;
        iPosition=LocateLastCharacter(pszPath,_T('/'));
    }
    if(iPosition==2&&pszPath[2]==_T(':')&&pszPath[3]==_T('\0')){//pszPath==ルート
        _tcscpy(pszResult,pszPath);
    }else{
        int iBackSlashPosition=lstrlen(pszPath)-1;
        _tcscpy(pszResult,pszPath);
        if(iPosition!=iBackSlashPosition){
            if(bSlash)_tcscat(pszResult,_T("/"));
            else _tcscat(pszResult,_T("\\"));
            bResult=true;
        }
    }
    return bResult;
}

//親ディレクトリを取得
//foo\bar\baz->foo\bar
//C:\foo\bar\baz->C:\foo\bar
//foo\->foo
bool GetParentDirectory(TCHAR* pszResult,const TCHAR* pszPath){
    int iPosition=-1;
    bool bResult=false;

    iPosition=LocateLastCharacter(pszPath,_T('\\'));
    if(iPosition==-1)iPosition=LocateLastCharacter(pszPath,_T('/'));
    if(iPosition==-1){//区切り文字が含まれない
        _tcscpy(pszResult,pszPath);
    }else{
        if(iPosition==2&&pszPath[2]==_T(':')&&pszPath[3]!=_T('\0')){//C:\foo\bar
            ++iPosition;
            _tcsncpy(pszResult,pszPath,iPosition);
        }else{
            _tcscpy(pszResult,pszPath);
            pszResult[iPosition]=_T('\0');
        }
        bResult=true;
    }
    return bResult;
}

//ルートディレクトリを取得
//foo\bar\baz->foo
/*C:\foo\bar->C:\*/
//foo\->foo
bool GetRootDirectory(TCHAR* pszResult,const TCHAR* pszPath){
    int iPosition=-1;
    bool bResult=false;

    iPosition=LocateLastCharacter(pszPath,_T('\\'));
    if(iPosition==-1)iPosition=LocateLastCharacter(pszPath,_T('/'));
    if(iPosition==-1){//区切り文字が含まれない
        _tcscpy(pszResult,pszPath);
    }else{
        iPosition=LocateFirstCharacter(pszPath,_T('\\'));
        if(iPosition==-1)iPosition=LocateFirstCharacter(pszPath,_T('/'));
        if(iPosition==2&&pszPath[2]==_T(':')&&pszPath[3]!=_T('\0')){//C:\foo\bar
            ++iPosition;
            _tcsncpy(pszResult,pszPath,iPosition);
        }else{
            _tcscpy(pszResult,pszPath);
            pszResult[iPosition]=_T('\0');
        }
        bResult=true;
    }
    return bResult;
}

//実行ファイルのディレクトリを取得
//C:\foo\bar\baz.exe->C:\foo\bar
bool GetExeDirectory(TCHAR* pszResult,const int iSize){
    bool bResult=false;

    if(GetModuleFileName(NULL,pszResult,iSize)){
        if(GetParentDirectory(pszResult,pszResult))bResult=true;
    }
    return bResult;
}

//ワイルドカードを含む文字列を比較
bool MatchSpec(TCHAR* pszFile,const TCHAR* pszSpec){
    switch(*(pszSpec)){
        case _T('\0'):return *pszFile==_T('\0');
        case _T('*'):return MatchSpec(pszFile,pszSpec+1)||((*(pszFile)!=_T('\0'))&&MatchSpec(pszFile+1,pszSpec));
        case _T('?'):return (*(pszFile)!=_T('\0'))&&MatchSpec(pszFile+1,pszSpec+1);
        default:return (*(pszFile)==*(pszSpec))&&MatchSpec(pszFile+1,pszSpec+1);
    }
}

//ディレクトリであるか否か
bool IsDirectory(const TCHAR* pszPath){
    return (bool)(GetFileAttributes(pszPath)&FILE_ATTRIBUTE_DIRECTORY);
}

//ファイルが存在するか否か
bool FileExists(const TCHAR* pszPath){
    return (bool)(GetFileAttributes(pszPath)!=0xffffffff);
}

//ファイルの最終更新日時を取得
bool GetFileLastModified(const TCHAR* pszPath,LPFILETIME lpftLastModified){
    bool bResult=false;
    HANDLE hFile=NULL;

    hFile=CreateFile(pszPath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if(hFile==INVALID_HANDLE_VALUE){
        lpftLastModified=NULL;
        return bResult;
    }

    bResult=GetFileTime(hFile,NULL,NULL,lpftLastModified);
    CloseHandle(hFile);
    return bResult;
}


#ifdef __cplusplus
}//namespace
#endif

Home > ソフトウェア > Ashley > Ashley130.zip/Ashley130.exe > Src > Path.cpp