Frost Moon Project

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

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

//GetDirName.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"GetDirName.h"
#include"UnRarFile.h"
#include"UnZipFile.h"
#include"ArcDll.h"
#include"Function.h"
#include"Path.h"
#include<shlwapi.h>

//Rarファイル内のディレクトリ名を取得する
int GetDirectoryNameInRar(TCHAR* pszRetPath,const TCHAR* pszFilePath){
    BOOL bSuccess=false;
    CUnRar UnRar;

    if(!UnRar.CheckReady()||!UnRar.OpenFile(pszFilePath,false))return ARC_ERROR_FILE_CANT_OPEN;//書庫ファイルを開くことが出来ない
    //ソリッド、マルチボリューム、ヘッダ暗号化書庫は無視する
    if(UnRar.IsArchiveSolid()||UnRar.IsArchiveVolume()||UnRar.IsArchiveEncryptedHeaders())return ARC_ERROR_FILE_NOT_SUPPORTED;//書庫ファイルは対応していない
    while(UnRar.ReadFileInfo()){
        /*if(!UnRar.IsDirectory()){//ディレクトリではない
            UnRar.SkipFile();
            continue;
        }*/
        if(path::LocateLastCharacter(UnRar.GetFileName(),_T('\\'))!=-1){
            _tcscpy(pszRetPath,UnRar.GetFileName());
            if(path::GetRootDirectory(pszRetPath,pszRetPath)){
                if(lstrlen(pszRetPath)>0){
                    bSuccess=true;
                    break;
                }
            }
        }
        UnRar.SkipFile();
    }
    return (bSuccess)?ARC_DEFAULT:ARC_ERROR_DIRECTORY_NOT_FOUND_IN_ARCHIVE;//エラーなしor書庫ファイルの中にディレクトリが見つからない
}

//Zipファイル内のディレクトリ名を取得する
int GetDirectoryNameInZip(TCHAR* pszRetPath,const TCHAR* pszFilePath){
    bool bSuccess=false;
    int iCount=0;
    CUnZip UnZip;

    if(!UnZip.OpenFile(pszFilePath))return ARC_ERROR_FILE_CANT_OPEN;//書庫ファイルを開くことが出来ない
    if((iCount=UnZip.GetFileCount())==0)return ARC_ERROR_DIRECTORY_NOT_FOUND_IN_ARCHIVE;//書庫ファイルの中にディレクトリが見つからない
    for(int i=0;i<iCount;i++){
        if(!UnZip.GetFileInfo(i))return ARC_ERROR_FILE_CANT_GET_INFORMATION;//書庫ファイル内の情報を取得出来ない
        //if(!UnZip.IsDirectory())continue;//ディレクトリでない
        if(path::LocateLastCharacter(UnZip.GetFileName(),_T('/'))!=-1){
            _tcscpy(pszRetPath,UnZip.GetFileName());
            if(path::GetRootDirectory(pszRetPath,pszRetPath)){
                if(lstrlen(pszRetPath)<1)break;
                bSuccess=true;
                break;
            }
        }
    }
    return (bSuccess)?ARC_DEFAULT:ARC_ERROR_DIRECTORY_NOT_FOUND_IN_ARCHIVE;//エラーなしor書庫ファイルの中にディレクトリが見つからない
}

//統合アーカイバ系ファイル内のディレクトリ名を取得する
int GetDirectoryNameInArc(TCHAR* pszRetPath,const TCHAR* pszFilePath){
    int iResult=ARC_DEFAULT;
    bool bSuccess=false;
    int iDllTypeCount=0;
    const int iMode=1;//CHECKARCHIVE_BASIC(1) 通常モード
    char szFilePathA[MAX_PATH]={0};//DLLに渡すファイル名
    CArcDll ArcDll;
    INDIVIDUALINFOA IndividualInfo;

    do{
        if(GetFileAttributes(pszFilePath)==(DWORD)-1)return ARC_ERROR_FILE_NOT_FOUND;//書庫ファイルが見つからない
        bool bSupported=false;

        WideCharToMultiByte(CP_ACP,0,pszFilePath,-1,szFilePathA,MAX_PATH,NULL,NULL);

        while(DllInfo[iDllTypeCount].lpszExtension!=NULL){
            if(DllInfo[iDllTypeCount].pbEnable){
                //DLLを読み込む
                if(!ArcDll.LoadDll(DllInfo[iDllTypeCount].lpszDll,DllInfo[iDllTypeCount].lpszPrefix))continue;
                //DLL独自のカーソルを表示しない
                ArcDll.SetCursorMode(false);
                if(ArcDll.CheckArchiveA(szFilePathA,iMode)!=false){
                    bSupported=true;//正しい書庫ファイルである
                    break;
                }
                //DLLを解放する
                ArcDll.UnloadDll();
            }
            iDllTypeCount++;
        }
        if(!bSupported){
            iResult=ARC_ERROR_FILE_NOT_SUPPORTED;//書庫ファイルは対応していない
            break;
        }

        if(ArcDll.GetRunning()){
            iResult=ARC_ERROR_DLL_IS_RUNNING;//DLLが実行中
            break;
        }

        if(ArcDll.OpenArchiveA(NULL,szFilePathA,0)==NULL){
            iResult=ARC_ERROR_FILE_CANT_OPEN;//書庫ファイルを開くことが出来ない
            break;
        }

        if(ArcDll.FindFirstA("*",&IndividualInfo)==-1){
            iResult=ARC_ERROR_FILE_CANT_GET_INFORMATION;//書庫ファイル内の情報を取得出来ない
            break;
        }

        if(!MultiByteToWideChar(CP_ACP,0,IndividualInfo.szFileName,-1,pszRetPath,MAX_PATH)){
            iResult=ARC_ERROR_FILE_CANT_GETFILENAME;//書庫ファイル内のファイル名を取得出来ない
            break;
        }

        if(path::LocateLastCharacter(pszRetPath,_T('\\'))==-1&&path::LocateLastCharacter(pszRetPath,_T('/'))==-1){//区切り文字が含まれない
            if(ArcDll.FindNextA(&IndividualInfo)==-1){
                iResult=ARC_ERROR_DIRECTORY_NOT_FOUND_IN_ARCHIVE;//書庫ファイルの中にディレクトリが見つからない
                break;
            }
            do{
                if(!MultiByteToWideChar(CP_ACP,0,IndividualInfo.szFileName,-1,pszRetPath,MAX_PATH)){
                    iResult=ARC_ERROR_FILE_CANT_GETFILENAME;
                    break;
                }

                if(path::LocateLastCharacter(pszRetPath,_T('\\'))!=-1||path::LocateLastCharacter(pszRetPath,_T('/'))!=-1){
                    bSuccess=true;
                    break;
                }
            }while(ArcDll.FindNextA(&IndividualInfo)!=-1);//検索終了まで回す
            if(!bSuccess){
                if(iResult==ARC_DEFAULT){
                    iResult=ARC_ERROR_DIRECTORY_NOT_FOUND_IN_ARCHIVE;//書庫ファイルの中にディレクトリが見つからない
                }
                break;
            }
        }
        path::GetRootDirectory(pszRetPath,pszRetPath);//ルートディレクトリを取得
    }while(0);

    ArcDll.CloseArchive();
    return iResult;
}

//書庫ファイル内のディレクトリ名を取得する
int GetDirectoryNameInArchive(TCHAR* pszRetPath,const TCHAR* pszFilePath){
    TCHAR szExtension[_MAX_EXT]={0};
    int iResult=-1;

    _tcscpy(szExtension,PathFindExtension(pszFilePath));
    if(_tcsicmp(szExtension,_T(".zip"))==0){
        iResult=GetDirectoryNameInZip(pszRetPath,pszFilePath);
    }else if(_tcsicmp(szExtension,_T(".rar"))==0){
        iResult=GetDirectoryNameInRar(pszRetPath,pszFilePath);
    }else{
        iResult=GetDirectoryNameInArc(pszRetPath,pszFilePath);
    }
    return iResult;
}

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