
Versión sin post-procesado del software del VmRideR
Dependencies: mbed
Diff: FileManager/SistemaArchivos.cpp
- Revision:
- 0:3d456b8ce449
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FileManager/SistemaArchivos.cpp Mon Jun 15 15:34:27 2015 +0000 @@ -0,0 +1,186 @@ +#include "SistemaArchivos.h" + +extern ScreenManager SC; +extern MSCFileSystem msc; + +extern DigitalOut myled; + +SistemaArchivos::SistemaArchivos(){ + nViajes = 0; +} + +void SistemaArchivos::addElement(char newElement[]){ + FILE* file = fopen("/local/RideList.vme","a"); + fprintf(file, "%s\n", newElement); + fclose(file); +} + +int SistemaArchivos::reloadRideNames(){ + // Se reinicia el número de viajes + nViajes = 0; + // Se abre el archivo de nombres de viajes + FILE* file = fopen("/local/RideList.vme","r"); + if(file == NULL){ + return 1; + }else{ + while(!feof(file)){ // Mientras no se haya llegado al fin de fichero + //strcpy(names[nViajes], readTextLine(file)); + fgets(names[nViajes], NCARACTERES, file); + // Se borra el último caracter de la cadena, el caracter '\n' + deleteLastChar(names[nViajes]); + //fscanf(file, "%s", names[nViajes]); + nViajes++; + } + // La última cadena es '\n', esta no se contara como cadena + nViajes--; + fclose(file); + return 0; + } +} + +int SistemaArchivos::deleteRide(char *fileName){ // Borra los archivos asociados a un viaje, y lo borra de la lista de viajes + char file[64]; + + // Primero se intenta borrar el archivo de la memoria flash + strcpy(file, "/usb/"); + strcat(file, fileName); + strcat(file, ".txt"); + + if(remove(file) != 0){ // Si no se pudo borrar se devuelve un 1 + return 1; + }else{ // Si se borró el archivo se borra también de la lista de viajes + // Para ello primero se borra el viaje del array "names" + // Procedimiento: + // - Se busca el nombre en la lista + // - Una vez encontrada su posición todos los elementos por debajo de este se suben una posición + int pos = 0; + + // - Se busca el nombre en la lista + while(strcmp(names[pos], fileName)){ + pos++; + } + + // En este momento la variable "pos" guarda la posición de memoria de el elemento a borrar + // Se aumenta en uno este índice para subir de posición los elementos por debajo de este + pos++; + + // - Una vez encontrada su posición todos los elementos por debajo de este se suben una posición + for (int i = pos; i < nViajes; i++){ + strcpy(names[i-1], names[i]); + } + + // El número de viajes es una unidad menor + nViajes--; + + // Se guarda la nueva lista de viajes + saveRideList(); + + return 0; + } +} + +int SistemaArchivos::renameRide(char *fileName, char *newName){ // Cambia el nombre de los archivos asociados a un viaje, y de la lista de viajes + char oldFile[64]; + char newFile[64]; + + // Primero se intenta cambiar el nombre del archivo de la memoria flash + strcpy(oldFile, "/usb/"); + strcat(oldFile, fileName); + strcat(oldFile, ".txt"); + + strcpy(newFile, "/usb/"); + strcat(newFile, newName); + strcat(newFile, ".txt"); + + if(file_rename(oldFile, newFile) != 0){ // Si no se pudo borrar se devuelve un 1 + return 1; + }else{ // Si se cambió el nombre del archivo también se cambia el nombre en la lista de viajes + // Procedimiento: + // - Se busca el nombre antiguo en la lista + // - Una vez encontrada su posición se cambia su nombre + int pos = 0; + + // - Se busca el nombre antiguo en la lista + while(strcmp(names[pos], fileName)){ + pos++; + } + + // - Una vez encontrada su posición se cambia su nombre + strcpy(names[pos], newName); + + // Se guarda la nueva lista de viajes + saveRideList(); + + return 0; + } +} + +bool SistemaArchivos::alredyExist(char *name){ + bool value = false; + for(int i = 0; i < nViajes; i++){ + if(!strcmp(names[i], name)){ + value = true; + } + } + return value; +} + +void SistemaArchivos::saveRideList(){ + // Se sobreescribe el archivo "RideList.vme" con la lista de el array nombres + FILE* file = fopen("/local/RideList.vme","w"); + for(int i = 0; i < nViajes; i++){ + fprintf(file, "%s\n", names[i]); + } + fclose(file); +} + +char* SistemaArchivos::getNameRide(int nameNumber){ + return names[nameNumber]; +} + +int SistemaArchivos::getNrides(){ + return nViajes; +} + +//*********************************************************** +// file_rename: renames a file. +// Kind of hoakey as it moves data instead of adjusting +// the file name in the directory. +// Checks to insure the file was renamed. +// Returns -1 = error; 0 = success +//*********************************************************** +int SistemaArchivos::file_rename(const char *oldfile, const char *newfile) { + int retval = 0; + int ch; + + FILE *fpold = fopen(oldfile, "r"); + if(fpold == NULL) { + retval = (-1); + }else{ + FILE *fpnew = fopen(newfile, "w"); + + while (1) { + ch = fgetc(fpold); + if (ch == EOF) break; + fputc(ch, fpnew); + } + + fclose(fpnew); + fclose(fpold); + + fpnew = fopen(newfile, "r"); + if(fpnew == NULL) { + retval = (-1); + } + else { + remove(oldfile); + } + fclose(fpnew); + } + return (retval); +} + +void SistemaArchivos::deleteLastChar(char *str){ // Borra el último caracter de una cadena + str[strlen(str)-1] = '\0'; +} + \ No newline at end of file