Frost Moon Project

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

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

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

//Rarファイル内のファイルリストを取得する
bool GetFileListInRar(std::vector<tstring>& vRetList,const TCHAR* pszFilePath){
    CUnRar UnRar;

    UnRar.CheckReady()&&UnRar.OpenFile(pszFilePath,false);
    //ソリッド、マルチボリューム、ヘッダ暗号化書庫は無視する
    if(UnRar.IsArchiveSolid()||UnRar.IsArchiveVolume()||UnRar.IsArchiveEncryptedHeaders())return false;//書庫ファイルは対応していない
    while(UnRar.ReadFileInfo()){
        LPTSTR lpszFileName=(LPTSTR)UnRar.GetFileName();
        for(int j=0;;j++){
            if(lpszFileName[j]==_T('/'))lpszFileName[j]=_T('\\');
            if(lpszFileName[j]==_T('\0'))break;
        }
        PathRemoveBackslash(lpszFileName);
        _tcscpy(lpszFileName,PathFindFileName(lpszFileName));
        vRetList.push_back(tstring(lpszFileName));
        UnRar.SkipFile();
    }
    return true;
}

//Zipファイル内のファイルリストを取得する
bool GetFileListInZip(std::vector<tstring>& vRetList,const TCHAR* pszFilePath){
    int iCount=0;
    int iOldBSlashCount=0,iBSlashCount=0;
    CUnZip UnZip;

    UnZip.OpenFile(pszFilePath);
    if((iCount=UnZip.GetFileCount())==0)return false;//書庫ファイルの中にファイルが見つからない
    for(int i=0;i<iCount;i++){
        if(!UnZip.GetFileInfo(i))return false;//書庫ファイル内の情報を取得出来ない
        LPTSTR lpszFileName=(LPTSTR)UnZip.GetFileName();
        for(int j=0;;j++){
            if(lpszFileName[j]==_T('/'))lpszFileName[j]=_T('\\');
            if(lpszFileName[j]==_T('\0'))break;
        }
        PathRemoveBackslash(lpszFileName);
        iBSlashCount=path::CountCharacter(lpszFileName,_T('\\'));
        //新しいディレクトリがHITした場合
        if(iBSlashCount!=iOldBSlashCount){
            path::GetParentDirectory(lpszFileName,lpszFileName);
            i--;
        }
        iOldBSlashCount=iBSlashCount;
        _tcscpy(lpszFileName,PathFindFileName(lpszFileName));
        dprintf(_T("lpszFileName=%s\n"),lpszFileName);
        vRetList.push_back(tstring(lpszFileName));
    }
    return true;
}

//統合アーカイバ系ファイル内のファイルリストを取得する
int GetFileListInArc(std::vector<tstring>& vRetList,const TCHAR* pszFilePath){
    bool bResult=false;
    int iDllTypeCount=0;
#if ARC_CHECK
    const int iMode=1;//CHECKARCHIVE_BASIC(1) 通常モード
#endif
    char szFilePathA[MAX_PATH]={0};//DLLに渡すファイル名
    CArcDll ArcDll;
    INDIVIDUALINFOA IndividualInfo;

    do{
        if(GetFileAttributes(pszFilePath)==(DWORD)-1)return false;//書庫ファイルが見つからない
        bool bSupported=false;
#if ARC_CHECK
        bool Checked=false;
#endif
        TCHAR szExtension[_MAX_EXT]={0};

        _tcscpy(szExtension,PathFindExtension(pszFilePath));
        while(DllInfo[iDllTypeCount].lpszExtension!=NULL){
            if((DllInfo[iDllTypeCount].pbEnable)&&
                (lstrcmpi(szExtension,DllInfo[iDllTypeCount].lpszExtension)==0)){
                bSupported=true;
                break;
            }
            iDllTypeCount++;
        }

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

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

#if ARC_CHECK
        if(!bChecked)break;//書庫ファイルは対応していない
#else
        if(!bSupported)break;//書庫ファイルは対応していない
#endif

        if(ArcDll.GetRunning())break;//DLLが実行中

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

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

        TCHAR szFileName[MAX_PATH]={0};
        TCHAR szTmp[MAX_PATH]={0};
        int iOldBSlashCount=0,iBSlashCount=0;

        if(MultiByteToWideChar(CP_ACP,0,IndividualInfo.szFileName,-1,szFileName,MAX_PATH)){
            for(int j=0;;j++){
                if(szFileName[j]==_T('/'))szFileName[j]=_T('\\');
                if(szFileName[j]==_T('\0'))break;
            }
            PathRemoveBackslash(szFileName);
            iBSlashCount=path::CountCharacter(szFileName,_T('\\'));
            _tcscpy(szFileName,PathFindFileName(szFileName));
            dprintf(_T("szFileName=%s\n"),szFileName);
            vRetList.push_back(tstring(szFileName));
            bResult=true;
        }

        while(ArcDll.FindNextA(&IndividualInfo)!=-1){
            if(MultiByteToWideChar(CP_ACP,0,IndividualInfo.szFileName,-1,szFileName,MAX_PATH)){
                for(int j=0;;j++){
                    if(szFileName[j]==_T('/'))szFileName[j]=_T('\\');
                    if(szFileName[j]==_T('\0'))break;
                }
                PathRemoveBackslash(szFileName);
                        dprintf(_T("[rw]szFileName=%s\n"),szFileName);

                iBSlashCount=path::CountCharacter(szFileName,_T('\\'));
                //新しいディレクトリがHITした場合
                if(iBSlashCount!=iOldBSlashCount){
                    path::GetParentDirectory(szTmp,szFileName);
                    _tcscpy(szTmp,PathFindFileName(szTmp));
                    dprintf(_T("[dir]szFileName=%s\n"),szFileName);
                    vRetList.push_back(tstring(szTmp));
                }
                iOldBSlashCount=iBSlashCount;
                _tcscpy(szFileName,PathFindFileName(szFileName));
                dprintf(_T("szFileName=%s\n"),szFileName);
                vRetList.push_back(tstring(szFileName));
            }
        }
    }while(0);

    ArcDll.CloseArchive();
    return bResult;
}

//書庫ファイル内のリストを取得
int GetFileList(std::vector<tstring>& vRetList,const TCHAR* pszFilePath){
    LPTSTR lpszExtension=NULL;
    int iResult=-1;

    lpszExtension=PathFindExtension(pszFilePath);
    if(_tcsicmp(lpszExtension,_T(".zip"))==0){
        iResult=GetFileListInZip(vRetList,pszFilePath);
    }else if(_tcsicmp(lpszExtension,_T(".rar"))==0){
        iResult=GetFileListInRar(vRetList,pszFilePath);
    }else{
        iResult=GetFileListInArc(vRetList,pszFilePath);
    }
    return iResult;
}

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