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