- Continue en altre comp
This commit is contained in:
127
respak2.cpp
127
respak2.cpp
@@ -2,10 +2,20 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
|
struct file_t
|
||||||
|
{
|
||||||
|
string path;
|
||||||
|
uint32_t size;
|
||||||
|
uint32_t offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
vector<file_t> toc;
|
||||||
|
|
||||||
void printHelp()
|
void printHelp()
|
||||||
{
|
{
|
||||||
cout << "Usage: respak2 <command>" << endl;
|
cout << "Usage: respak2 <command>" << endl;
|
||||||
@@ -21,6 +31,24 @@ void printErrorAndExit(string errorMsg) {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool createDirectories(const string& dirName)
|
||||||
|
{
|
||||||
|
fs::path path(dirName);
|
||||||
|
|
||||||
|
std::error_code err;
|
||||||
|
if (!fs::create_directories(path.remove_filename(), err))
|
||||||
|
{
|
||||||
|
if (fs::exists(path.remove_filename()))
|
||||||
|
{
|
||||||
|
return true; // the folder probably already existed
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("createDirectories: FAILED to create [%s], err:%s\n", dirName.c_str(), err.message().c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void printDirectory(string path, int tabs=0)
|
void printDirectory(string path, int tabs=0)
|
||||||
{
|
{
|
||||||
for (const auto & entry : fs::directory_iterator(path))
|
for (const auto & entry : fs::directory_iterator(path))
|
||||||
@@ -31,20 +59,37 @@ void printDirectory(string path, int tabs=0)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void packDirectory(string path, ofstream fo, uint32_t& num_files, uint32_t& toc_index)
|
void packDirectory(string path, ofstream& fo, uint32_t& num_files, uint32_t& offset)
|
||||||
{
|
{
|
||||||
|
for (const auto & entry : fs::directory_iterator(path))
|
||||||
|
{
|
||||||
|
if (entry.is_directory())
|
||||||
|
packDirectory(entry.path().string(), fo, num_files, offset);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const string filename = entry.path().string();
|
||||||
|
ifstream fi(filename, ios::binary |ios::ate);
|
||||||
|
if (!fi.is_open()) printErrorAndExit("ERROR: Error al obrir l'arxiu '"+filename+"'.");
|
||||||
|
const uint32_t size = fi.tellg();
|
||||||
|
fi.seekg(0);
|
||||||
|
fo << fi.rdbuf();
|
||||||
|
fi.close();
|
||||||
|
toc.push_back({filename, size, offset});
|
||||||
|
cout << filename << ":" << size << ":" << offset << endl;
|
||||||
|
num_files++;
|
||||||
|
offset+=size;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void doPack()
|
void doPack()
|
||||||
{
|
{
|
||||||
printDirectory("data");
|
//printDirectory("data");
|
||||||
|
|
||||||
uint32_t num_files = 4;
|
uint32_t num_files = 0;
|
||||||
uint32_t toc_offset = 512;
|
uint32_t toc_offset = 12;
|
||||||
|
|
||||||
ofstream fo;
|
ofstream fo ("data.jf2", ios::binary);
|
||||||
fo.open("data.jf2", ios::binary);
|
|
||||||
if (!fo.is_open()) printErrorAndExit("ERROR: No s'ha pogut obrir l'arxiu 'data.jf2'.");
|
if (!fo.is_open()) printErrorAndExit("ERROR: No s'ha pogut obrir l'arxiu 'data.jf2'.");
|
||||||
fo.write("PK2",4);
|
fo.write("PK2",4);
|
||||||
fo.write( (char*)&num_files, 4 );
|
fo.write( (char*)&num_files, 4 );
|
||||||
@@ -52,6 +97,15 @@ void doPack()
|
|||||||
|
|
||||||
packDirectory("data", fo, num_files, toc_offset);
|
packDirectory("data", fo, num_files, toc_offset);
|
||||||
|
|
||||||
|
for (auto file : toc)
|
||||||
|
{
|
||||||
|
fo.write( (char*)&file.offset, 4 );
|
||||||
|
fo.write( (char*)&file.size, 4 );
|
||||||
|
const uint8_t path_size = file.path.size();
|
||||||
|
fo.write( (char*)&path_size, 1 );
|
||||||
|
fo.write( file.path.c_str(), path_size );
|
||||||
|
}
|
||||||
|
|
||||||
fo.seekp(4);
|
fo.seekp(4);
|
||||||
fo.write( (char*)&num_files, 4 );
|
fo.write( (char*)&num_files, 4 );
|
||||||
fo.write( (char*)&toc_offset, 4 );
|
fo.write( (char*)&toc_offset, 4 );
|
||||||
@@ -61,12 +115,71 @@ void doPack()
|
|||||||
|
|
||||||
void doUnpack()
|
void doUnpack()
|
||||||
{
|
{
|
||||||
|
ifstream fi ("data.jf2", ios::binary);
|
||||||
|
if (!fi.is_open()) printErrorAndExit("ERROR: No s'ha pogut obrir l'arxiu 'data.jf2'.");
|
||||||
|
char header[4];
|
||||||
|
fi.read(header, 4);
|
||||||
|
uint32_t num_files, toc_offset;
|
||||||
|
fi.read((char*)&num_files, 4);
|
||||||
|
fi.read((char*)&toc_offset, 4);
|
||||||
|
fi.seekg(toc_offset);
|
||||||
|
|
||||||
|
for (int i=0; i<num_files; ++i)
|
||||||
|
{
|
||||||
|
uint32_t file_offset, file_size;
|
||||||
|
fi.read( (char*)&file_offset, 4 );
|
||||||
|
fi.read( (char*)&file_size, 4 );
|
||||||
|
uint8_t path_size;
|
||||||
|
fi.read( (char*)&path_size, 1 );
|
||||||
|
char file_name[path_size+1];
|
||||||
|
fi.read( file_name, path_size );
|
||||||
|
file_name[path_size] = 0;
|
||||||
|
string filename = file_name;
|
||||||
|
// cout << filename << " : " << file_size << " : " << file_offset << endl;
|
||||||
|
toc.push_back({filename, file_size, file_offset});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto file : toc)
|
||||||
|
{
|
||||||
|
fi.seekg(file.offset);
|
||||||
|
if (!createDirectories(file.path)) printErrorAndExit("ERROR: No s'ha pogut crear la ruta '"+file.path+"'.");
|
||||||
|
ofstream fo (file.path, ios::binary);
|
||||||
|
if (!fo.is_open()) printErrorAndExit("ERROR: No s'ha pogut obrir l'arxiu '"+file.path+"'.");
|
||||||
|
char* buffer = (char*)malloc(file.size);
|
||||||
|
fi.read(buffer, file.size);
|
||||||
|
fo.write(buffer, file.size);
|
||||||
|
fo.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
fi.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void doList()
|
void doList()
|
||||||
{
|
{
|
||||||
|
ifstream fi ("data.jf2", ios::binary);
|
||||||
|
if (!fi.is_open()) printErrorAndExit("ERROR: No s'ha pogut obrir l'arxiu 'data.jf2'.");
|
||||||
|
char header[4];
|
||||||
|
fi.read(header, 4);
|
||||||
|
uint32_t num_files, toc_offset;
|
||||||
|
fi.read((char*)&num_files, 4);
|
||||||
|
fi.read((char*)&toc_offset, 4);
|
||||||
|
fi.seekg(toc_offset);
|
||||||
|
|
||||||
|
for (int i=0; i<num_files; ++i)
|
||||||
|
{
|
||||||
|
uint32_t file_offset, file_size;
|
||||||
|
fi.read( (char*)&file_offset, 4 );
|
||||||
|
fi.read( (char*)&file_size, 4 );
|
||||||
|
uint8_t path_size;
|
||||||
|
fi.read( (char*)&path_size, 1 );
|
||||||
|
char file_name[path_size+1];
|
||||||
|
fi.read( file_name, path_size );
|
||||||
|
file_name[path_size] = 0;
|
||||||
|
string filename = file_name;
|
||||||
|
cout << filename << " : " << file_size << " : " << file_offset << endl;
|
||||||
|
toc.push_back({filename, file_size, file_offset});
|
||||||
|
}
|
||||||
|
fi.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
|||||||
Reference in New Issue
Block a user