-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGuardarDataFileJSON.c
More file actions
281 lines (262 loc) · 9.21 KB
/
GuardarDataFileJSON.c
File metadata and controls
281 lines (262 loc) · 9.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
/*
============================================================================
Name : 20180904_GuardarDataFileJSON.c
Author : ASRC
Version : 1.0
Copyright : HB
Description : Función para recibir un archivo en formato hexadecimal junto a
la cantidad de datos incluidos dentro del mismo, para luego ser
guardados en formato JSON bajo el nombre
"aaaammddhhmmss_DataSetCMS2000.json".
La conversión de datos en hexadecimal a los respectivos formatos
numéricos dentro del archivo JSON se realiza dentro de esta
función.
============================================================================
*/
/*******************************************************************************
PENDIENTES GuardarDataFileJSON:
- MAXFILESJSON debería ser un parámetro dentro del archivo de configuración
.ini.
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pwd.h>
#include <time.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/dir.h>
#include "Headers/Manejodatafiles.h"
//Cantidad de archivos en formato JSON que se escribirán en el directorio.
#define MAXFILESJSON 1000;
//Función para recibir un archivo en formato hexadecimal junto a la cantidad de
//datos incluidos dentro del mismo, para luego ser guardados en formato JSON
//bajo el nombre "aaaammddhhmmss_DataSetCMS2000.json".
//La conversión de datos en hexadecimal a los respectivos formatos de cada dato
//se realiza dentro de la función "Hex2Json()".
//
//La función devuelve:
// 0: Archivo creado satisfactoriamente.
// 1: Error al crear el archivo.
int GuardarDataFileJSON(char *arrayhex, int sizeofarrayhex)
{
//**************************
// Declaración de variables.
//**************************
int retunlink = 0; //Retorna estado de la función borrar archivo.
int maxfilebuffer = MAXFILESJSON; //Cantidad de archivos en el buffer.
//char arrayjson[10000] = {0};
//malloc(10000); //Array recibido del la función Hex2Json que convierte de hexadecimal a JSON los datos.
//Obtengo el directorio HOME del usuario actual.
struct passwd *pw = getpwuid(getuid()); //Leo la estructura passwd que contiene el dirmuestras HOME del usuario.
char *homedir = pw->pw_dir; //Guardo el directorio HOME del usuario actual en la variable "homedir".
//Estructura para verificar si el directorio ya existe.
struct stat dircomp;
//Declaración de nombres de archivo y directorio de muestras.
const char nombase[] = "_DataCMS2000.json"; //Nombre base del archivo.
const char barra[] = "/";
const char dirmuestras[] = "MuestrasCMS2000_JSON"; //Directorio en donde van los archivos con los valores de aceleración.
FILE *fcrear; //Archivo a crear (FIFO).
//Variables de directorio.
DIR *dir;
struct dirent **namelist;
int n = 0;
//Variables de hora y fecha.
time_t now;
struct tm *ts;
char buf[80] = {0};
char timestamp[16] = {0};
//Obtengo la hora actual.
now = time(0);
//Formateo e imprimo fecha y hora en fromato "aaaammddhhmmss".
ts = localtime(&now);
strftime(buf, sizeof(buf), "%Y%m%d%H%M%S", ts);
strftime(timestamp, sizeof(timestamp), "%Y%m%d%H%M%S", ts);
//Creo la variable "directorio" para verificar si el mismo existe antes de crearlo.
char *directorio = malloc(strlen(homedir) + strlen(barra) + strlen(dirmuestras) + strlen(barra) + 1); //Nombre del directorio en donde irían las muestras.
strcpy(directorio, homedir);
strcat(directorio, barra);
strcat(directorio, dirmuestras);
strcat(directorio, barra);
//Armo el path completo más el nombre del archivo que se creará.
char *nomarch = malloc(strlen(homedir) + strlen(barra) + strlen(dirmuestras) + \
strlen(barra) + strlen(buf) + strlen(nombase) + 1); //Nombre archivo + path completo.
strcpy(nomarch, homedir);
strcat(nomarch, barra);
strcat(nomarch, dirmuestras);
strcat(nomarch, barra);
strcat(nomarch, buf);
strcat(nomarch, nombase);
//Mido la longitud del path incluyendo nombre del archivo que se borrará.
char *nombaseborrar = malloc(strlen(directorio) + strlen(buf) + strlen(nombase));
//******************************
// Fin declaración de variables.
//******************************
//Chequeo y luego creo el directorio de muestras.
if(stat(directorio, &dircomp) == -1)
{
//Si no existe creo el directorio con permisos de escritura para el usuario home.
mkdir(directorio, 0755);
}
//**********************************************************************
//**************Cola circular del tipo FIFO de 1000 archivos************
//**********************************************************************
//Verifico si existe el directorio en donde se graban las muestras, sino lo creo.
if((dir = opendir(directorio)) == NULL)
{
printf("Falló opendir().\n");
//Libero memoria.
//free(arrayjson);
//arrayjson = NULL;
closedir(dir);
free(*namelist);
free(directorio);
directorio = NULL;
free(nomarch);
nomarch = NULL;
free(nombaseborrar);
nombaseborrar = NULL;
return EXIT_FAILURE;
}
else
{
if ((n = scandir(directorio, &namelist, NULL, alphasort)) == -1)
{
//Si scandir da -1 hubo un error.
printf("Falló función \"scandir\".\n");
//Libero memoria.
//free(arrayjson);
//arrayjson = NULL;
closedir(dir);
free(*namelist);
free(directorio);
directorio = NULL;
free(nomarch);
nomarch = NULL;
free(nombaseborrar);
nombaseborrar = NULL;
return EXIT_FAILURE;
}
//Si la cantidad de archivos del directorio de muestras es menor a 1000, guardo los archivos en la cola FIFO.
else if (n > 0 && n < (maxfilebuffer+2))
{
//Abro el archivo dentro del directorio "~/MuestrasCMS2000" iterando los nombres de los mismos por segundo.
if ((fcrear = fopen(nomarch, "wb")) == NULL)
{
//Falla al crear directorio.
printf("El archivo no pudo ser creado.\n");
//Libero memoria.
fclose(fcrear);
//free(arrayjson);
//arrayjson = NULL;
closedir(dir);
free(*namelist);
free(directorio);
directorio = NULL;
free(nomarch);
nomarch = NULL;
free(nombaseborrar);
nombaseborrar = NULL;
return EXIT_FAILURE;
}
else
{
//Acá se llama a la función de conversión de hexadecimal a JSON y se escribe el archivo JSON.
//arrayjson = HexAJson(timestamp, arrayhex); //Acá se hace la conversión de HEXADECIMAL a JSON.
//HexAJson(timestamp, arrayhex);
//fprintf(fcrear, "%s", arrayjson); //Copia del array convertido de hexadecimal a JSON al archivo.
//printf("Dirección ARRAYJSON: %p\n", &arrayjson);
//fflush(fcrear);
}
}
//Si llegué a tener más de 1000 archivos en el directorio, empiezo a borrar en orden FIFO.
else if (n >= (maxfilebuffer+2)) //Debido a los directorios . y .. se suman dos directorios.
{
//Creo el path completo incluyendo el nombre del archivo a borrar.
strcpy(nombaseborrar, directorio);
strcat(nombaseborrar, namelist[2]->d_name);
if((retunlink = unlink(nombaseborrar)) == -1)
{
//Error al querer borrar el archivo.
printf("No se ha podido borrar el archivo.\n");
//Libero memoria.
//free(arrayjson);
//arrayjson = NULL;
closedir(dir);
free(*namelist);
free(directorio);
directorio = NULL;
free(nomarch);
nomarch = NULL;
free(nombaseborrar);
nombaseborrar = NULL;
return EXIT_FAILURE;
}
else
{
//Archivo borrado en forma correcta.
}
//Borro un archivo y creo otro archivo dentro del directorio "~/MuestrasCMS2000" iterando los nombres de los mismos por segundo.
if ((fcrear = fopen(nomarch, "wb")) == NULL)
{
//Error al querer crear un archivo.
printf("El archivo no pudo ser creado.\n");
//Libero memoria.
fclose(fcrear);
//free(arrayjson);
//arrayjson = NULL;
closedir(dir);
free(*namelist);
free(directorio);
directorio = NULL;
free(nomarch);
nomarch = NULL;
free(nombaseborrar);
nombaseborrar = NULL;
return EXIT_FAILURE;
}
else
{
//Acá se llama a la función de conversión de hexadecimal a JSON y se escribe el archivo JSON.
//arrayjson = HexAJson(timestamp, arrayhex); //Acá se hace la conversión de HEXADECIMAL a JSON.
//HexAJson(timestamp, arrayhex);
//fprintf(fcrear, "%s", arrayjson); //Copia del array convertido de hexadecimal a JSON al archivo.
//printf("Dirección ARRAYJSON: %p\n", &arrayjson);
//fflush(fcrear);
}
}
else
{
//Error general de la función GuardarDataFileJSON.
printf("Error de la función GuardarDataFileJSON");
//Libero memoria.
//free(arrayjson);
//arrayjson = NULL;
closedir(dir);
free(*namelist);
free(directorio);
directorio = NULL;
free(nomarch);
nomarch = NULL;
free(nombaseborrar);
nombaseborrar = NULL;
return EXIT_FAILURE;
}
}
//Libero memoria.
fclose(fcrear);
//free(arrayjson);
//arrayjson = NULL;
closedir(dir);
free(*namelist);
free(directorio);
directorio = NULL;
free(nomarch);
nomarch = NULL;
free(nombaseborrar);
nombaseborrar = NULL;
//Finalizó sin error.
return EXIT_SUCCESS;
}