void createDiffFile(string fileName) { string fileDirectory = getFilePath(fileName); string diff = fileName + "-diff.dat"; ofstream diffFile(fileDirectory + '\\' + diff); diffFile << "0\nV0\n0"; diffFile.close(); }
bool HGTController::expandDiff(CourgetteInstance* ci, MCFCore::MCFFile* file) { m_hFile.close(); UTIL::FS::Path path(m_szInstallDir, file->getName(), false); path += file->getPath(); gcString oldFile = path.getFullPath(); gcString diffFile("{0}_diff", m_szFile); try { UTIL::FS::FileHandle fhSrc(m_szFile, UTIL::FS::FILE_READ); UTIL::FS::FileHandle fhDest(diffFile.c_str(), UTIL::FS::FILE_WRITE); fhSrc.seek(file->getOffSet()); decompressDiff(file->getDiffSize(), fhSrc, fhDest); UTIL::FS::delFile(diffFile); } catch (gcException) { UTIL::FS::delFile(diffFile); return false; } MD5Progressive md5; try { m_hFile.open(m_szFile, UTIL::FS::FILE_APPEND); m_hFile.seek(file->getOffSet()); } catch (...) { return false; } uint64 fsize = file->getSize(); uint64 tot = 0; bool res = ci->applyDiff(oldFile.c_str(), diffFile.c_str(), [this, &md5, &tot, fsize](const char* buff, size_t size) -> bool { md5.update(buff, size); return writeDiff(tot, fsize, buff, size); }); return (res && md5.finish() == file->getCsum()); }
bool addExistingFile(string fileName, string address, string owner) { string fileDirectory = getFilePath(fileName); if (!isSaved(fileName)) throw accessError(NOT_SAVED); if (!isExisting(address)) throw accessError(NO_FILE); if (!isAccessable(fileName, owner)) throw accessError(NOT_USER); diffTree tree(fileName); diffNode* start = tree.getTreePathByID(tree.currentVersion); diffNode* finish = tree.getTreePath(); modernizeFile(fileName, tree.getVersionsPath(start, finish)); vector<diffString> exf; vector<diffString> newf; ifstream existingFile(fileDirectory + '\\' + fileName); ifstream newFile(address); while (!existingFile.eof()) { diffString buf; buf.text = new char[MAX]; existingFile.getline(buf.text, MAX); buf.length = strlen(buf.text); exf.push_back(buf); } while (!newFile.eof()) { diffString buf; buf.text = new char[MAX]; newFile.getline(buf.text, MAX); buf.length = strlen(buf.text); newf.push_back(buf); } vector<diffString> difference = diff(exf, newf); showChangesVector(difference); diffNode* child = new diffNode; child->diffLine = difference; tree.addNode(finish, child); ofstream diffFile(fileDirectory + '\\' + fileName + "-diff.dat"); diffFile.close(); tree.printDiffTreeFile(fileName); deleteFile(fileName); addFile(fileName, address); return true; }
int bsdiff(const char* old, const char* newf, const char* patch) { return diffFile(old, newf, patch);//diff(argc, argv); }
int C3dsTool::Action() { if (m_eAction == kActionExtract) { if (!extractFile()) { printf("ERROR: extract file failed\n\n"); return 1; } } if (m_eAction == kActionCreate) { if (!createFile()) { printf("ERROR: create file failed\n\n"); return 1; } } if (m_eAction == kActionEncrypt) { if (!encryptFile()) { printf("ERROR: encrypt file failed\n\n"); return 1; } } if (m_eAction == kActionUncompress) { if (!uncompressFile()) { printf("ERROR: uncompress file failed\n\n"); return 1; } } if (m_eAction == kActionCompress) { if (!compressFile()) { printf("ERROR: compress file failed\n\n"); return 1; } } if (m_eAction == kActionTrim) { if (!trimFile()) { printf("ERROR: trim file failed\n\n"); return 1; } } if (m_eAction == kActionPad) { if (!padFile()) { printf("ERROR: pad file failed\n\n"); return 1; } } if (m_eAction == kActionDiff) { if (!diffFile()) { printf("ERROR: create patch file failed\n\n"); return 1; } } if (m_eAction == kActionPatch) { if (!patchFile()) { printf("ERROR: apply patch file failed\n\n"); return 1; } } if (m_eAction == kActionSample) { return sample(); } if (m_eAction == kActionHelp) { return Help(); } return 0; }