void FileManager :: openFile(){ fileBuffer = (char*)calloc(1,getSizeOfFile()-sizeOfHeader); const char* extBin = ".bin"; std::string result = std::string(directory) +std::string(getNameOfFile()) + std::string(extBin); const char * FileNameBin = result.c_str(); fstream fsr(FileNameBin, std::ios::out | std::ios::in | std::ios::binary ); if(fsr){ int temp = fsr.tellg(); fsr.seekg(sizeOfHeader,ios::beg); fsr.read((char*)fileBuffer,getSizeOfFile()-sizeOfHeader ); fsr.seekg(temp,ios::beg); } else{ cout<<"no hay archivo"<<endl; } fsr.close(); }
void FileManager :: printHeader(){ cout << "---------------------Header------------------------------------"<< endl; cout << "nombre de tabla : "<< getNameOfFile() << endl; cout << "tamaño archivo : "<< getSizeOfFile() << endl; cout << "num reg : "<< getNumberOfRegisters() << endl; cout << "num libres : "<< getNumberOfFreeRegisters() << endl; cout << "primer reg : "<< getPtrOfFirstRegister() << endl; cout << "primer libre : "<< getPtrToFirstRegisterFree() << endl; cout << "ultimo reg : "<< getPtrToLastRegister() << endl; cout << "tamañoRegistro : "<< getSizeOfRegister() << endl; cout << "num de columnas : "<< getNumberOfColumns() << endl; cout << "---------------------end-of-Header------------------------------------"<< endl; }
bool checkFileSize(const char *filename, int min, int max) { int filesize = getSizeOfFile(filename); if (filesize == -1) return false; if (min > 0 && filesize < min) return false; if (max > 0 && filesize > max) return false; return true; }
int main( int argc, char **argv ) { bool valid( false ); if( argc == 2 ) { unsigned int basicCheck = getSizeOfFile( argv[1] ); if( basicCheck > 0 ) { printf("Source:\t%s\n\n", argv[1] ); TStream *patchFile; // If large-ish file, stream it if( basicCheck > ( 1 << 23 ) ) { printf("WARNING: Large file!\n\n"); patchFile = new TFileStream( argv[1] ); valid = dynamic_cast<TFileStream *>( patchFile )->isOpen(); } // Else, load it to memory else { patchFile = new TMemoryStream; valid = dynamic_cast<TMemoryStream *>( patchFile )->LoadFromFile( argv[1] ); } if( valid ) getMpfInfo( *patchFile ); patchFile->Close(); delete patchFile; } } if( !( valid ) ) printf("Usage:\nmpfInfo <patchfile.mpf>\n\n"); return 0; }
void FileManager :: addNewRegister(void* register_buffer ){ const char* extBin = ".bin"; std::string result = std::string(directory) +std::string(nameOfFile) + std::string(extBin); const char * FileNameBin = result.c_str(); fstream fs(FileNameBin, std::ios::out | std::ios::in | std::ios::binary ); if(fs){ int temp = fs.tellp();//se guarda la posicion incial del seek fs.seekp (0, ios::end);//se coloca el seek al final del archivo //si el archivo esta vacio if(getSizeOfFile() == sizeOfHeader){ setPtrOfFirstRegister(sizeOfHeader); setPtrToLastRegister(sizeOfHeader); } else{//si el archivo tiene mas de un registro //se solicita espacio para el ultimo registro a del archivo void* ultimoReg = calloc(1, *sizeOfRegister); //se coloca el seek al final del archivo fs.seekg(getPtrToLastRegister(), ios::beg); fs.seekp(getPtrToLastRegister(), ios::beg); //se lee el ultimo registro fs.read((char*)ultimoReg,*sizeOfRegister); //se obtiene el puntero en disco al siguiente int* ptr_al_siguiente = (int*)(ultimoReg + OFFSET_PTRSIG); //al ptr siguiente se desreferencia y se pone el puntero al final //más el tamaño del nuevo registro *ptr_al_siguiente = getPtrToLastRegister()+ *sizeOfRegister; //se coloca el puntero seek al final del archivopara agregar al final fs.seekg(getPtrToLastRegister(), ios::beg); fs.seekp(getPtrToLastRegister(), ios::beg); //se escribe en disco el ultimo registro fs.write(reinterpret_cast<const char*>(ultimoReg),getSizeOfRegister()); //se apunta ptr_anterior al inicio del registro int* ptr_anterior = (int*)register_buffer; //tomo el ultimo reg y antes de guardar lo pongo como anterior *ptr_anterior = getPtrToLastRegister(); //actualizo puntero al ultimo registro setPtrToLastRegister(fs.tellp()); } fs.seekp (0, ios::end);//se coloca el seek al final del archivo //guardo el registro al final del archivo en disco fs.write(reinterpret_cast<const char*>(register_buffer),getSizeOfRegister()); setNumberOfRegisters(getNumberOfRegisters() + 1); fs.seekp (0, ios::end);//se coloca el seek al final del archivo setSizeOfFile(fs.tellp()); fs.seekp(temp,ios::end);//se recupera el seek original } else cout<<"Error 002 :No se puede añadir registro porque archivo no existe"<<endl; fs.close();//cierro el objeto fstream free(register_buffer); //libero el espacio que soliticte para el buffer }