From 46a88301904674daa53ac2b4fd62a414b13aad12 Mon Sep 17 00:00:00 2001 From: "Valeriano A.R" Date: Thu, 4 Dec 2014 00:10:57 +0100 Subject: [PATCH] Microoptimization scanning the filesystem --- src/filenode.c | 45 ++++++++++++++--------------- src/filenode.h | 3 +- src/fileutil.c | 77 +++++++++++++++++++++++++++++++++++--------------- src/fileutil.h | 2 ++ src/main.c | 27 ++++++++---------- 5 files changed, 91 insertions(+), 63 deletions(-) diff --git a/src/filenode.c b/src/filenode.c index a4bbe65..c187039 100644 --- a/src/filenode.c +++ b/src/filenode.c @@ -121,14 +121,19 @@ char *FileNode_GetFullPath(FileNode *fileNode, char *basePath, char *path) { return temppath; } -void FileNode_GetSize(FileNode *fileNode, char *filePath) { +void FileNode_GetSize(FileNode *fileNode, char *file) { fileNode->flags |= FileFlag_HasSize; - fileNode->size = File_GetSize(filePath); + fileNode->size = File_GetSize(file); } -void FileNode_GetFecha(FileNode *fileNode, char *filePath) { +void FileNode_GetTime(FileNode *fileNode, char *file) { fileNode->flags |= FileFlag_HastTime; - fileNode->fileTime = FileTime_Get(filePath); + fileNode->fileTime = FileTime_Get(file); +} + +void FileNode_GetSizeAndTime(FileNode *fileNode, char *file) { + fileNode->flags |= FileFlag_HasSize | FileFlag_HastTime; + File_GetSizeAndTime(file, &fileNode->size, &fileNode->fileTime); } void FileNode_GetCRC(FileNode *fileNode, char *filePath) { @@ -306,22 +311,16 @@ void FileNode_PrintNode(FileNode *fileNode) { } printf("\n"); - /* - // Tamanho - if(fn->flags&FileFlag_TieneTamanho){ - printf("\\-Tamanho: %lld\n",fn->size); - } + if(fileNode->flags&FileFlag_HasSize){ + printf("\\-Tamanho: %lld\n",fileNode->size); + } + if(fileNode->flags&FileFlag_HastTime){ + printf("\\-Fecha : ");FileTime_Print(fileNode->fileTime);printf("\n"); + } + if(fileNode->flags&FileFlag_HasCRC){ + printf("\\-CRC : [%08X]\n",fileNode->crc); + } - // Fecha - if(fn->flags&FileFlag_TieneFecha){ - printf("\\-Fecha : ");FileTime_Print(fn->ft);printf("\n"); - } - - // CRC - if(fn->flags&FileFlag_TieneCRC){ - printf("\\-CRC : [%08X]\n",fn->crc); - } - */ } void FileNode_Print(FileNode *fileNode) { @@ -368,13 +367,12 @@ FileNode *FileNode_Build(char *path) { if (File_IsDirectory(path)) { // Obtener datos para los directorios fileNode->flags |= FileFlag_Directory; - FileNode_GetFecha(fileNode, path); + FileNode_GetTime(fileNode, path); File_IterateDir(path, FileNode_Build_Iterate, fileNode); } else { // Obtener datos para los ficheros fileNode->flags |= FileFlag_Normal; - FileNode_GetSize(fileNode, path); - FileNode_GetFecha(fileNode, path); + FileNode_GetSizeAndTime(fileNode, path); } return (fileNode); @@ -462,12 +460,11 @@ FileNode *FileNode_Refresh(FileNode *fileNode, char *filePath) { fileNode->flags |= FileFlag_Normal; fileNode->flags &= ~FileFlag_Directory; } - size = File_GetSize(filePath); + File_GetSizeAndTime(filePath, &size, &fileTime); if (size != fileNode->size) { fileNode->estado = FileStatus_Modified; fileNode->size = size; } - fileTime = FileTime_Get(filePath); if (fileTime != fileNode->fileTime) { fileNode->estado = FileStatus_Modified; fileNode->fileTime = fileTime; diff --git a/src/filenode.h b/src/filenode.h index 1bf457d..b2023b9 100644 --- a/src/filenode.h +++ b/src/filenode.h @@ -43,7 +43,8 @@ void FileNode_AddChild(FileNode *file, FileNode *file2); char *FileNode_GetFullPath(FileNode *fileNode, char *basePath, char *path); void FileNode_GetSize(FileNode *fileNode, char *file); -void FileNode_GetFecha(FileNode *fileNode, char *file); +void FileNode_GetTime(FileNode *fileNode, char *file); +void FileNode_GetSizeAndTime(FileNode *fileNode, char *file); void FileNode_GetCRC(FileNode *fileNode, char *file); void FileNode_Save(FileNode *fileNode, char *fichero); diff --git a/src/fileutil.c b/src/fileutil.c index b646459..a797586 100644 --- a/src/fileutil.c +++ b/src/fileutil.c @@ -77,18 +77,18 @@ void FileTime_Set(char *fileName, FileTime fileTime) { #else -FileTime FileTime_Get(char *filename) { +FileTime FileTime_Get(char *fileName) { struct stat fs; - lstat(filename, &fs); + lstat(fileName, &fs); return (fs.st_mtime); } -void FileTime_Set(char *filename, FileTime t) { +void FileTime_Set(char *fileName, FileTime t) { struct utimbuf utb; utb.actime = t; utb.modtime = t; - utime(filename, &utb); + utime(fileName, &utb); } #endif @@ -137,9 +137,9 @@ int File_ExistsPath(char *path) { } return (1); } -int File_IsDirectory(char *dir) { +int File_IsDirectory(char *fileName) { unsigned rc; - rc = GetFileAttributes(dir); + rc = GetFileAttributes(fileName); if (rc == INVALID_FILE_ATTRIBUTES ) { return (0); @@ -149,9 +149,9 @@ int File_IsDirectory(char *dir) { } return (0); } -int File_IsFile(char *fichero) { +int File_IsFile(char *fileName) { unsigned rc; - rc = GetFileAttributes(fichero); + rc = GetFileAttributes(fileName); if (rc == INVALID_FILE_ATTRIBUTES ) { return (0); @@ -171,10 +171,10 @@ int File_ExistsPath(char *path) { } return (1); } -int File_IsDirectory(char *dir) { +int File_IsDirectory(char *fileName) { struct stat info; - if (lstat(dir, &info) == -1) { + if (lstat(fileName, &info) == -1) { return (0); } if (S_ISDIR(info.st_mode)) { @@ -182,10 +182,10 @@ int File_IsDirectory(char *dir) { } return (0); } -int File_IsFile(char *fichero) { +int File_IsFile(char *fileName) { struct stat info; - if (lstat(fichero, &info) == -1) { + if (lstat(fileName, &info) == -1) { return (0); } if (S_ISDIR(info.st_mode)) { @@ -195,19 +195,50 @@ int File_IsFile(char *fichero) { } #endif -long long File_GetSize(char *file) { - FILE *f; - long long tamanho; - f = fopen(file, "rb"); - if (!f) - return (-1); - - fseek(f, 0, SEEK_END); - tamanho = ftell(f); - fclose(f); - return (tamanho); +#ifdef WIN32 +long long File_GetSize(char *fileName) { + HANDLE hFile; + DWORD fSize; + hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); + GetFileSize(hFile, &fSize); + CloseHandle(hFile); + return (fSize); } +#else +long long File_GetSize(char *fileName) { + struct stat fs; + lstat(fileName, &fs); + return (fs.st_size); +} +#endif + + +#ifdef WIN32 +void File_GetSizeAndTime(char *fileName, long long *size, FileTime *time) { + HANDLE hFile; + DWORD fSize; + FILETIME ftCreate, ftAccess, ftWrite; + hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); + GetFileSize(hFile, &fSize); + GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite); + CloseHandle(hFile); + *size = fSize; + *time = FileTime_to_POSIX(ftWrite); +} +#else +void File_GetSizeAndTime(char *fileName, long long *size, FileTime *time) { + struct stat fs; + lstat(fileName, &fs); + *size = fs.st_size; + *time = fs.st_mtime +} +#endif + + + #ifdef WIN32 int File_MakeDirectory(char *path) { diff --git a/src/fileutil.h b/src/fileutil.h index d673a63..47077d8 100644 --- a/src/fileutil.h +++ b/src/fileutil.h @@ -25,6 +25,8 @@ int File_IsFile(char *path); long long File_GetSize(char *ficheros); +void File_GetSizeAndTime(char *ficheros, long long *size, FileTime *time); + int File_MakeDirectory(char *path); void File_IterateDir(char *path, diff --git a/src/main.c b/src/main.c index d304fa2..3be2622 100644 --- a/src/main.c +++ b/src/main.c @@ -33,11 +33,6 @@ FileNode *CheckDir(char *path, int recheck); int Sync(char *pathLeft, char *pathRight, int recheck, int dryRun); int main(int argc, char *argv[]) { - FILE *file; - unsigned long crc = 0; - FileTime fileTime; - int i; - if (argc < 2) { Help(argv[0]); return 0; @@ -45,17 +40,12 @@ int main(int argc, char *argv[]) { if (!strcmp(argv[1], "info") && argc >= 3) { // Informacion de ficheros + int i; for (i = 2; i < argc; i++) { if (File_ExistsPath(argv[i])) { - file = fopen(argv[i], "rb"); - if (file) { - crc = CRC_File(file); - fclose(file); - } - fileTime = FileTime_Get(argv[i]); - printf("%s:\t[%08X]\t", argv[i], crc); - FileTime_Print(fileTime); - printf("\n"); + FileNode *fileNode = FileNode_Build(argv[i]); + FileNode_GetCRC(fileNode, argv[i]); + FileNode_PrintNode(fileNode); } } } else if (!strcmp(argv[1], "scan") && argc == 4) { @@ -64,9 +54,9 @@ int main(int argc, char *argv[]) { FileNode *fileNode; printf("Building FileNode..\n"); fileNode = FileNode_Build(argv[2]); - FileNode_Save(fileNode, argv[3]); tScan=Time_GetTime()-tScan; printf("tScan: %9lldus\n",tScan); + FileNode_Save(fileNode, argv[3]); } else if (!strcmp(argv[1], "rescan") && argc == 4) { // Scanear informacion de directorio y guardar arbol FileNode *fileNode; @@ -79,6 +69,13 @@ int main(int argc, char *argv[]) { tScan=Time_GetTime()-tScan; printf("tScan: %9lldus\n",tScan); FileNode_Save(fileNode, argv[3]); + }else{ + printf("Building FileNode..\n"); + long long tScan=Time_GetTime(); + fileNode = FileNode_Build(argv[2]); + tScan=Time_GetTime()-tScan; + printf("tScan: %9lldus\n",tScan); + FileNode_Save(fileNode, argv[3]); } } else if (!strcmp(argv[1], "read") && argc == 3) { // Leer informacion de arbol