UnixFdIO::UnixFdIO(const int readingFd, const int writingFd) { namespace bp = boost::process; bp::detail::file_handle fhRead(readingFd); bp::detail::file_handle fhWrite(writingFd); reading_.reset(new bp::pistream(fhRead)); writing_.reset(new bp::postream(fhWrite)); dynamic_cast<bp::detail::systembuf*>(reading_->rdbuf())->event_read_data.connect( boost::phoenix::bind(&UnixFdIO::slotReadData, this, boost::phoenix::arg_names::_1)); }
bool CompressFile(gcString &filePath) { uint64 fileSize = UTIL::FS::getFileSize(UTIL::FS::Path(filePath, "", true)); if (fileSize == 0) return false; gcString destPath(filePath); destPath += ".bz2"; try { UTIL::FS::FileHandle fhRead(filePath.c_str(), UTIL::FS::FILE_READ); UTIL::FS::FileHandle fhWrite(destPath.c_str(), UTIL::FS::FILE_WRITE); if (fhRead.isValidFile() == false) return false; if (fhWrite.isValidFile() == false) return false; UTIL::MISC::BZ2Worker worker(UTIL::MISC::BZ2_COMPRESS); char buff[10*1024]; const size_t buffsize = 10*1024; uint32 leftToDo = (uint32)fileSize; bool end = false; do { size_t curSize = buffsize; if (buffsize > leftToDo) { end = true; curSize = leftToDo; } fhRead.read(buff, curSize); leftToDo -= curSize; worker.write(buff, curSize, end); worker.doWork(); size_t b = 0; do { b = buffsize; worker.read(buff, b); fhWrite.write(buff, b); } while (b > 0); } while (!end); } catch (gcException) { return false; } UTIL::FS::delFile(UTIL::FS::Path(filePath, "", true)); filePath = destPath; return true; }