int indexDocuments(Configuration c, Extension extension) { /*Cette fonction permet pour une extension définie de : - Recuperer la liste des fichiers de cette extension - Recuperer la liste des fichiers deja indexes - Comparer ces deux listes afin de supprimer les descripteurs ou indexer les nouveaux fichiers si necessaire */ //Dans l'integralité des fonctions gerant les "listes de fichiers", celles-ci étant des listes de chaines de caractères //on utilisera non pas un tableau à deux dimension mais un tableau à une dimension de cette forme : // |---PATH1---|---PATH2---|---PATH3---|--- avec chaque path de taille maximale PATH_SIZE (macro) //(ce choix a ete notamment fait pour simplifier la gestion dynamique de la memoire) //Recuperation de la liste des fichiers textes présent dans le répertoire indexé char* dir_file_list; int nbFiles_Dir = getDirectoryFileList(&dir_file_list, c.rootPath, extension); //Récuperation de la liste des fichiers textes déjà indexés (infos présentes dans ./data/liste_base_texte) char* indexed_file_list; int nbFiles_Indexed = getIndexedFileList(&indexed_file_list, extension); //Comparaison des deux listes pour générer la liste des fichiers à indexés et la liste des descripteurs devant être supprimés if(nbFiles_Dir==0 && nbFiles_Indexed==0) { free(dir_file_list); free(indexed_file_list); return 1; //Cas OK () mais rien à faire } char* toIndex; char* toDelete; int* nbComp; nbComp = compareDirAndIndexedFiles(dir_file_list, nbFiles_Dir, indexed_file_list, nbFiles_Indexed, &toIndex, &toDelete); int nbFilesToIndex = nbComp[0]; int nbDescToDelete = nbComp[1]; free(nbComp); //Supression des descripteurs //Parcours de liste_base : récuperation de l'id descripteur et suppression de la ligne pour chaque fichier à "desindexer" //Parcours de base : suppression des descripteur dont les ids ont été récupéré lors du parcours de liste_base removeDescriptors(toDelete, nbDescToDelete, extension); free(toDelete); //Indexation des fichiers et ajout à la base de données switch(extension) { case TEXTE: indexTextFiles(toIndex, nbFilesToIndex, c); break; case IMAGE: indexImageFiles(toIndex, nbFilesToIndex, c); break; case AUDIO: indexAudioFiles(toIndex, nbFilesToIndex, c); break; } free(toIndex); free(dir_file_list); free(indexed_file_list); return 1; }
bool getDirectoryFileList(const std::string& Directory, std::vector<FileEntry>& result, const std::string& Prefix, const bool recursive) { FileEntry one; #if defined(_WIN32) //Windows part intptr_t handle; struct _finddata_t sr; sr.attrib = _A_NORMAL | _A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_VOLID | _A_SUBDIR | _A_ARCH; handle = _findfirst(std::string(Directory+"*").c_str(),&sr); if (handle == -1) { std::cout << "getDirectoryFileList: ERROR: unable to open directory \"" << Directory <<"\". Returning incomplete list.\n"; return false; } //search it while(_findnext(handle, &sr)==0) { one.FileName = Prefix + std::string(sr.name); one.IsDirectory = ((sr.attrib & _A_SUBDIR)==_A_SUBDIR); result.push_back(one); if (recursive and one.IsDirectory and (std::string(sr.name)!=".") and (std::string(sr.name)!="..")) { //call function recursively if (!getDirectoryFileList(Directory+std::string(sr.name)+DirectorySeparator, result, Prefix+std::string(sr.name)+DirectorySeparator, recursive)) { //error occurred, close handle and return _findclose(handle); return false; } }//if recursive }//while _findclose(handle); #else //Linux part DIR * direc = opendir(Directory.c_str()); if (direc == NULL) { std::cout << "getDirectoryFileList: ERROR: unable to open directory \"" << Directory <<"\". Returning incomplete list.\n"; return false; }//if struct dirent* entry = readdir(direc); while (entry != NULL) { one.FileName = Prefix + std::string(entry->d_name); one.IsDirectory = entry->d_type==DT_DIR; //check for socket, pipes, block device and char device, which we don't want if (entry->d_type != DT_SOCK && entry->d_type != DT_FIFO && entry->d_type != DT_BLK && entry->d_type != DT_CHR) { result.push_back(one); if (recursive and one.IsDirectory and (std::string(entry->d_name)!=".") and (std::string(entry->d_name)!="..")) { //call function recursively if (!getDirectoryFileList(Directory+std::string(entry->d_name)+DirectorySeparator, result, Prefix+std::string(entry->d_name)+DirectorySeparator, recursive)) { //error occurred, close handle and return closedir(direc); return false; } }//if recursive }//if wanted file type entry = readdir(direc); }//while closedir(direc); #endif return true; }//function