function plotMonth(var value,int type) { int periods = 22; LookBack = max(LookBack,periods); int n = (periods*tdm())/max(periods,tom()); //int n = (periods*day())/max(periods,dom()); if(n > periods) return; plotSeason(n,n,month(),value,type); }
//指定されたディレクトリ内部を展開する;高速実装 bool CArchiver7ZIP::ExtractDirectoryEntry(LPCTSTR lpszArcFile,CConfigManager &ConfMan,const ARCHIVE_ENTRY_INFO_TREE* lpBase,const ARCHIVE_ENTRY_INFO_TREE* lpDir,LPCTSTR lpszOutputBaseDir,bool bCollapseDir,CString &strLog) { //---一時フォルダ中にまとめて展開し、後からフォルダ構造を切り出す std::list<CString> files; CString strPath; bool bRestoreDir=false; if(lpDir->strFullPath.IsEmpty()){ //ディレクトリが登録されていないのでパス名を算出する ArcEntryInfoTree_GetNodePathRelative(lpDir,lpBase,strPath); strPath.Replace(_T('/'),_T('\\')); CPath tmpPath(strPath); tmpPath.RemoveBackslash(); //ディレクトリだったら裸にする tmpPath.RemoveFileSpec(); //親ディレクトリまで切りつめる tmpPath.Append(_T("*")); //特定ディレクトリ以下の全てのファイルを展開 files.push_back(tmpPath); bRestoreDir=true; }else{ //ディレクトリもアーカイブ中にエントリとして登録されているなら出力する CString tmpPath(lpDir->strFullPath); if(tmpPath[tmpPath.GetLength()-1]==_T('\\')||tmpPath[tmpPath.GetLength()-1]==_T('/')){ //末尾の\もしくは/を削除 tmpPath.Delete(tmpPath.GetLength()-1); } files.push_back(tmpPath); strPath=lpDir->strFullPath; strPath.Replace(_T('/'),_T('\\')); } //-------------------------------------- // 修正された出力ディレクトリパスを算出 //-------------------------------------- //---本来の出力先 CString strOutputDir=lpszOutputBaseDir+strPath; if(strOutputDir.GetLength()>_MAX_PATH){ //フォルダ名が長くなりすぎた strLog=CString(MAKEINTRESOURCE(IDS_ERROR_MAX_PATH)); return false; } //FileListには1件しか入っていないはず ASSERT(files.size()==1); //一時フォルダ CTemporaryDirectoryManager tdm(_T("lhaf")); CPath strTempOutput(tdm.GetDirPath()); if(bRestoreDir){ //ディレクトリを手作業で復元 strTempOutput+=strPath; strTempOutput.AddBackslash(); TRACE(_T("手作業でのディレクトリ復元:%s\n"),(LPCTSTR)strTempOutput); if(!UtilMakeSureDirectoryPathExists(strTempOutput)){ strLog.Format(IDS_ERROR_CANNOT_MAKE_DIR,strTempOutput); return false; } } //---一時フォルダ中にまとめて展開し、後からフォルダ構造を切り出す // ファイルを展開 if(!ExtractSpecifiedOnly(lpszArcFile,ConfMan,strTempOutput,files,strLog,true)){ return false; } //送り側ファイル名指定 CPath tmp(strTempOutput); tmp+=(LPCTSTR)strPath; //PathAppend相当 tmp.RemoveBackslash(); CString strSrcFiles(tmp); strSrcFiles+=_T("||"); //受け側ファイル名指定 tmp=lpszOutputBaseDir; { CString strTmp; ArcEntryInfoTree_GetNodePathRelative(lpDir,lpBase,strTmp); strTmp.Replace(_T('/'),_T('\\')); tmp+=(LPCTSTR)strTmp; } tmp.AddBackslash(); CString strDestFiles(tmp); strDestFiles+=_T("||"); //'|'を'\0'に変換する std::vector<TCHAR> srcBuf(strSrcFiles.GetLength()+1); UtilMakeFilterString(strSrcFiles,&srcBuf[0],srcBuf.size()); std::vector<TCHAR> destBuf(strDestFiles.GetLength()+1); UtilMakeFilterString(strDestFiles,&destBuf[0],destBuf.size()); //ファイル操作内容 SHFILEOPSTRUCT fileOp={0}; fileOp.wFunc=FO_MOVE; fileOp.fFlags=FOF_MULTIDESTFILES|/*FOF_NOCONFIRMATION|*/FOF_NOCONFIRMMKDIR|FOF_NOCOPYSECURITYATTRIBS|FOF_NO_CONNECTED_ELEMENTS; fileOp.pFrom=&srcBuf[0]; fileOp.pTo=&destBuf[0]; //移動実行 if(::SHFileOperation(&fileOp)){ //エラー strLog=CString(MAKEINTRESOURCE(IDS_ERROR_FILE_MOVE)); return false; }else if(fileOp.fAnyOperationsAborted){ //キャンセル strLog=CString(MAKEINTRESOURCE(IDS_ERROR_USERCANCEL)); return false; } return true; }
bool CArchiver7ZIP::AddItemToArchive(LPCTSTR ArcFileName,const std::list<CString> &FileList,CConfigManager &ConfMan,LPCTSTR lpDestDir,CString &strLog) { // レスポンスファイル用テンポラリファイル名取得 TCHAR ResponceFileName[_MAX_PATH+1]; FILL_ZERO(ResponceFileName); if(!UtilGetTemporaryFileName(ResponceFileName,_T("zip"))){ strLog=CString(MAKEINTRESOURCE(IDS_ERROR_TEMPORARY_FILE_CREATE)); return false; } ASSERT(0!=_tcslen(ResponceFileName)); //===一時的にファイルをコピー //---\で終わる基点パスを取得 CPath strBasePath; UtilGetBaseDirectory(strBasePath,FileList); TRACE(_T("%s\n"),strBasePath); //---テンポラリに対象ファイルをコピー //テンポラリ準備 CTemporaryDirectoryManager tdm(_T("lhaf")); CPath strDestPath(tdm.GetDirPath()); strDestPath+=lpDestDir; UtilMakeSureDirectoryPathExists(strDestPath); // 圧縮対象ファイル名を修正する const int BasePathLength=((CString)strBasePath).GetLength(); CString strSrcFiles; //コピー元ファイルの一覧 CString strDestFiles; //コピー先ファイルの一覧 std::list<CString>::const_iterator ite; for(ite=FileList.begin();ite!=FileList.end();++ite){ //ベースパスを元に相対パス取得 : 共通である基底パスの文字数分だけカットする LPCTSTR lpSrc((LPCTSTR)(*ite)+BasePathLength); //送り側ファイル名指定 strSrcFiles+=(strBasePath+lpSrc); //PathAppend相当 strSrcFiles+=_T('|'); //受け側ファイル名指定 strDestFiles+=strDestPath+lpSrc; strDestFiles+=_T('|'); } strSrcFiles+=_T('|'); strDestFiles+=_T('|'); //'|'を'\0'に変換する std::vector<TCHAR> srcBuf(strSrcFiles.GetLength()+1); UtilMakeFilterString(strSrcFiles,&srcBuf[0],srcBuf.size()); std::vector<TCHAR> destBuf(strDestFiles.GetLength()+1); UtilMakeFilterString(strDestFiles,&destBuf[0],destBuf.size()); //ファイル操作内容 SHFILEOPSTRUCT fileOp={0}; fileOp.wFunc=FO_COPY; fileOp.fFlags=FOF_MULTIDESTFILES|FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOCOPYSECURITYATTRIBS|FOF_NO_CONNECTED_ELEMENTS; fileOp.pFrom=&srcBuf[0]; fileOp.pTo=&destBuf[0]; //コピー実行 if(::SHFileOperation(&fileOp)){ //エラー strLog=CString(MAKEINTRESOURCE(IDS_ERROR_FILE_COPY)); return false; }else if(fileOp.fAnyOperationsAborted){ //キャンセル strLog=CString(MAKEINTRESOURCE(IDS_ERROR_USERCANCEL)); return false; } //カレントディレクトリ設定 ::SetCurrentDirectory(tdm.GetDirPath()); // 同時に、レスポンスファイル内にアーカイブ名および圧縮対象ファイル名を記入する { HANDLE hFile=CreateFile(ResponceFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(INVALID_HANDLE_VALUE==hFile){ strLog=CString(MAKEINTRESOURCE(IDS_ERROR_TEMPORARY_FILE_ACCESS)); return false; } //レスポンスファイルへの書き込み //全て圧縮 WriteResponceFile(hFile,_T("*")); CloseHandle(hFile); } //=========================== // DLLに渡すオプションの設定 //=========================== TRACE(_T("DLLに渡すオプションの設定\n")); CString Param;//コマンドライン パラメータ バッファ CConfigZIP confZIP; CConfig7Z conf7Z; ASSERT(ArchiverGetArchiveType); switch(ArchiverGetArchiveType(C2UTF8(ArcFileName))){ case 1: //ZIP形式で圧縮 confZIP.load(ConfMan); if(!FormatCompressCommandZIP(confZIP,Param,false,0,NULL,NULL,strLog)){ DeleteFile(ResponceFileName); return false; } break; case 2: //7z形式で圧縮 conf7Z.load(ConfMan); if(!FormatCompressCommand7Z(conf7Z,Param,0,NULL,strLog)){ DeleteFile(ResponceFileName); return false; } break; default: ASSERT(!"This code cannot be run"); //エラー処理が面倒なので放っておく。 return false; } Param+=_T("-scsUTF-8 "); //レスポンスファイルのコードページ指定 //作業ディレクトリ Param+=_T("\"-w"); Param+=UtilGetTempPath(); Param+=_T("\" "); //圧縮先ファイル名指定 Param+=_T("\""); Param+=ArcFileName; Param+=_T("\" "); //レスポンスファイル名指定 Param+=_T("\"@"); Param+=ResponceFileName; Param+=_T("\""); ASSERT(!Param.IsEmpty()); TRACE(_T("ArchiveHandler Commandline Parameter:%s\n"),Param); TRACE(_T("ArchiveHandler呼び出し\n")); //char szLog[LOG_BUFFER_SIZE]={0}; std::vector<BYTE> szLog(LOG_BUFFER_SIZE); szLog[0]='\0'; int Ret=ArchiveHandler(NULL,C2UTF8(Param),(LPSTR)&szLog[0],LOG_BUFFER_SIZE-1); CString strTmp; UtilToUNICODE(strTmp,&szLog[0],szLog.size()-1,UTILCP_UTF8); //strLog=&szLog[0]; strLog=strTmp; //使ったレスポンスファイルは消去 DeleteFile(ResponceFileName); return 0==Ret; }
void testTDM(void) { std::default_random_engine generator; std::uniform_real_distribution<double> distribution(-1000., 1000.); auto rnd = std::bind(distribution, generator); std::size_t N = 10; vec a(N, 0.); vec a2(N, 0.); vec b(N, 0.); vec b2(N, 0.); vec c(N-1, 0); vec c2(N-1, 0); b[0] = rnd(); c[0] = rnd(); for (std::size_t i=1; i<N-1; i++) { a[i] = rnd(); a2[i] = rnd(); b[i] = rnd(); b2[i] = rnd(); c[i] = rnd(); c2[i] = rnd(); } a[N-1] = rnd(); b[N-1] = rnd(); TDM tdm(a, b, c); const TDM tdm2(a2, b2, c2); tdm.add(tdm2); vtype s = rnd(); tdm.scale(s); auto a3 = tdm.get(TDM::Diagonal::A); auto a4 = tdm.get(TDM::Diagonal::A, true); auto b3 = tdm.get(TDM::Diagonal::B); auto b4 = tdm.get(TDM::Diagonal::B, true); auto c3 = tdm.get(TDM::Diagonal::C); auto c4 = tdm.get(TDM::Diagonal::C, true); a4.insert(a4.begin(), 0.); assert(a3.size() == a4.size()); assert(a4.size() == b3.size()); assert(b3.size() == b4.size()); assert(b4.size() == c3.size()+1); assert(c3.size() == c4.size()); assert(c4.size()+1 == N); for (size_t i=0; i<N; i++) { assert(std::abs(a3[i] - a4[i]) < 1e-10); assert(std::abs(b3[i] - b4[i]) < 1e-10); assert(std::abs(c3[i] - c4[i]) < 1e-10); assert(std::abs(a3[i] - s*(a[i]+a2[i])) < 1e-10); assert(std::abs(b3[i] - s*(b[i]+b2[i])) < 1e-10); assert(std::abs(c3[i] - s*(c[i]+c2[i])) < 1e-10); } vec x(N, 0.); for (size_t i=0; i<N; i++) { x[i] = rnd(); } const TDM tdm3(tdm); auto inverted = tdm3.invert(x); auto y = tdm.transform(inverted); for (size_t i=0; i<N; i++) { assert(std::abs(x[i] - y[i]) < 1e-10); } }