Status Carver::compress(const std::set<boost::filesystem::path>& paths) { auto arch = archive_write_new(); if (arch == nullptr) { return Status(1, "Failed to create tar archive"); } // Zipping doesn't seem to be working currently // archive_write_set_format_zip(arch); archive_write_set_format_pax_restricted(arch); auto ret = archive_write_open_filename(arch, archivePath_.string().c_str()); if (ret == ARCHIVE_FATAL) { archive_write_free(arch); return Status(1, "Failed to open tar archive for writing"); } for (const auto& f : paths) { PlatformFile pFile(f.string(), PF_OPEN_EXISTING | PF_READ); auto entry = archive_entry_new(); archive_entry_set_pathname(entry, f.leaf().string().c_str()); archive_entry_set_size(entry, pFile.size()); archive_entry_set_filetype(entry, AE_IFREG); archive_entry_set_perm(entry, 0644); // archive_entry_set_atime(); // archive_entry_set_ctime(); // archive_entry_set_mtime(); archive_write_header(arch, entry); // TODO: Chunking or a max file size. std::ifstream in(f.string(), std::ios::binary); std::stringstream buffer; buffer << in.rdbuf(); archive_write_data(arch, buffer.str().c_str(), buffer.str().size()); in.close(); archive_entry_free(entry); } archive_write_free(arch); PlatformFile archFile(archivePath_.string(), PF_OPEN_EXISTING | PF_READ); updateCarveValue(carveGuid_, "size", std::to_string(archFile.size())); updateCarveValue( carveGuid_, "sha256", hashFromFile(HashType::HASH_TYPE_SHA256, archivePath_.string())); return Status(0, "Ok"); };
void populate(Folder &folder) { // Get a list of the files in this directory. Archive::Names names; archive().listFiles(names, basePath); DENG2_FOR_EACH(Archive::Names, i, names) { if(folder.has(*i)) { // Already has an entry for this, skip it (wasn't pruned so it's OK). continue; } String entry = basePath / *i; std::auto_ptr<ArchiveEntryFile> archFile(new ArchiveEntryFile(*i, archive(), entry)); // Write access is inherited from the main source file. if(allowWrite) archFile->setMode(File::Write); // Use the status of the entry within the archive. archFile->setStatus(archive().entryStatus(entry)); // Create a new file that accesses this feed's archive and interpret the contents. File *f = folder.fileSystem().interpret(archFile.release()); folder.add(f); // We will decide on pruning this. f->setOriginFeed(&self); // Include the file in the main index. folder.fileSystem().index(*f); } // Also populate subfolders. archive().listFolders(names, basePath); for(Archive::Names::iterator i = names.begin(); i != names.end(); ++i) { folder.fileSystem().makeFolder(folder.path() / *i, FS::InheritPrimaryFeed); } }
void ArchivBuilder::addFile( QString fileName, QString extractFileName, QString newInternalFileName ) { ArchivFile archFile( QFileInfo( fileName ), extractFileName, newInternalFileName ); ArchivFileReference* ref = _data->appendFile( &archFile ); _index->addFileReference( ref ); delete ref; }