static bool add_file(CTar32CmdInfo &cmdinfo, CTar32 *pTarfile, const char *fname,std::vector<char> &buffer) { CTar32FileStatus &stat = pTarfile->m_currentfile_status; std::string fname2 = fname; EXTRACTINGINFOEX extractinfo; EXTRACTINGINFOEX64 exinfo64; MakeExtractingInfo(pTarfile,fname2.c_str(),extractinfo,exinfo64); { int ret = SendArcMessage(cmdinfo, ARCEXTRACT_BEGIN, &extractinfo,&exinfo64); if(ret){throw CTar32Exception("Cancel button was pushed.",ERROR_USER_CANCEL);} // fname2 = extractinfo.exinfo.szDestFileName; } size64 filesize = pTarfile->m_currentfile_status.original_size; if(filesize == 0){return true;} CTar32InternalFile file; file.open(pTarfile, /*write*/true); //std::ifstream fs_r; fast_fstream fs_r; fs_r.open(fname2.c_str(), std::ios::in|std::ios::binary); if(fs_r.fail()){throw CTar32Exception("can't read file", ERROR_CANNOT_READ);return false;} size64 readsize = 0; size64 n; while(fs_r.read(&buffer[0],buffer.size()),(n=fs_r.gcount())>0){ size64 m = file.write(&buffer[0], n); if(m>0){readsize += m;} if(n!=m){ throw CTar32Exception("can't write to arcfile", ERROR_CANNOT_WRITE); } // if(cmdinfo.hTar32StatusDialog){ extractinfo.exinfo.dwWriteSize = (DWORD)readsize; exinfo64.exinfo.dwWriteSize = (DWORD)readsize; exinfo64.llWriteSize = readsize; int ret = SendArcMessage(cmdinfo, ARCEXTRACT_INPROCESS, &extractinfo,&exinfo64); if(ret){throw CTar32Exception("Cancel button was pushed.",ERROR_USER_CANCEL);} // } } bool bret = file.close(); if(!bret){throw CTar32Exception("can't write to arcfile", ERROR_CANNOT_WRITE);} // if(cmdinfo.hTar32StatusDialog){ extractinfo.exinfo.dwWriteSize = (DWORD)readsize; exinfo64.exinfo.dwWriteSize = (DWORD)readsize; exinfo64.llWriteSize = readsize; int ret = SendArcMessage(cmdinfo, 6, &extractinfo,&exinfo64); if(ret){throw CTar32Exception("Cancel button was pushed.",ERROR_USER_CANCEL);} // } return true; }