#include "CDirectorio.h"
CDirectorio::CDirectorio()
{
this->listaDeArchivos = new CListaDeArchivos;
}
//******************************************************
// Metodo que recorre el directorio indicado por el usuario
// y llama al metodo getDatosArchivoYAgregarALista()
//******************************************************
TError CDirectorio::recorrerDirectorio(TString nombreDirectorio)
{
struct dirent **listadeNombres;
TString nombreXML;
//levanto los nombres en la ListadeNombres
long longitud = scandir(nombreDirectorio.c_str(), &listadeNombres, 0, alphasort);
//verifico si encontro alguno
if (longitud < 0)
{
// Error al levantar los nombres de los archivos
return ERROR_DIRECTORIO;
}
else
{
long i = 0;
short largo = 0;
while(i < longitud)
{
// Tomo el nombre del archivo y exijo que termine en .XML/.xml y todas
// sus variaciones. Tampoco seran tenidos en cuenta archivos que contengan
// vocales con tilde o la "ENIE"
nombreXML = (const char*)listadeNombres[i]->d_name;
if (nombreXML != CONFIGURACION_XML)
{
largo = nombreXML.size() - 1;
if (((nombreXML[largo] == 'L') || (nombreXML[largo] == 'l')) &&
((nombreXML[largo-1] == 'M') || (nombreXML[largo-1] == 'm')) &&
((nombreXML[largo-2] == 'X') || (nombreXML[largo-2] == 'x')) &&
(nombreXML[largo-3] == '.'))
{
if ( (strchr((const char*)listadeNombres[i]->d_name,'ñ') == NULL) ||
(strchr((const char*)listadeNombres[i]->d_name,'á') == NULL) ||
(strchr((const char*)listadeNombres[i]->d_name,'é') == NULL) ||
(strchr((const char*)listadeNombres[i]->d_name,'í') == NULL) ||
(strchr((const char*)listadeNombres[i]->d_name,'ó') == NULL) ||
(strchr((const char*)listadeNombres[i]->d_name,'ú') == NULL))
{
if (getDatosArchivoYAgregarALista((const char*)listadeNombres[i]->d_name, nombreDirectorio) == ERROR_DIRECTORIO)
{
free(listadeNombres);
return ERROR_BUSQUEDA_ARCHIVOS;
}
}
}
free(listadeNombres[i]);
i++;
} // Nombre distinto de configuracion.xml
else
i++;
}
free(listadeNombres);
}
return OK;
}
//******************************************************
// Metodo que obtiene los datos del archivo cuyo nombre
// es recibido por parametro. Los agrega a la lista
//******************************************************
TError CDirectorio::getDatosArchivoYAgregarALista(const char* nombreArchivo,
TString directorio)
{
TString strFecha;
struct stat estrStat;
CInfoDeArchivos infoArch;
CNodoListaArchivos nodo;
TString strFileName;
strFileName = directorio.c_str() ;
strFileName += '/';
strFileName += nombreArchivo;
//Levanto los datos del archivo
int error = stat(strFileName.c_str() , &estrStat);
// todo bien
if(error == 0)
{
// Si es un archivo regular => lo tomo, caso contario salteo directorios, sockets, ....
if (S_ISREG(estrStat.st_mode))
{
strFecha = ctime(&estrStat.st_mtime);
infoArch.setNombre(nombreArchivo);
infoArch.setFechaModificacion(strFecha);
// La 1era vez digo que la operacion es 'C' -> CREAR
nodo.setOperacion('C');
nodo.setInfoDeArchivo(infoArch);
listaDeArchivos->agregaNodoListaArchivos(nodo);
}
}
else
{
return ERROR_DIRECTORIO;
}
return OK;
}
//******************************************************
CListaDeArchivos& CDirectorio::getListaDeArchivos()
{
return *listaDeArchivos;
}
CDirectorio::~CDirectorio()
{
if (this->listaDeArchivos != NULL)
delete this->listaDeArchivos;
}