diff --git a/src/filesel.c b/src/filesel.c index 82c3a937..3c2a02f0 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -1743,10 +1743,10 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context // Si c'est un fichier if (Selector->Position+Selector->Offset>=Filelist.Nb_directories) // On efface le fichier (si on peut) - temp=(!remove(Selector_filename)); + temp=(!Remove_path(Selector_filename)); else // Si c'est un repertoire // On efface le repertoire (si on peut) - temp=(!rmdir(Selector_filename)); + temp=(!Remove_directory(Selector_filename)); if (temp) // temp indique si l'effacement s'est bien passé { diff --git a/src/io.c b/src/io.c index d7d51359..aa8f9c73 100644 --- a/src/io.c +++ b/src/io.c @@ -360,20 +360,43 @@ int File_is_hidden(const char *fname, const char *full_name) return fname[0]=='.' && strcmp(fname, PARENT_DIR); #endif } -// Taille de fichier, en octets -int File_length(const char * fname) + +// File size in bytes +unsigned long File_length(const char * fname) { - struct stat infos_fichier; - if (stat(fname,&infos_fichier)) - return 0; - return infos_fichier.st_size; +#if defined(WIN32) + WIN32_FILE_ATTRIBUTE_DATA infos; + if (GetFileAttributesExA(fname, GetFileExInfoStandard, &infos)) + { + return (unsigned long)(((DWORD64)infos.nFileSizeHigh << 32) + (DWORD64)infos.nFileSizeLow); + } + else + return 0; +#else + struct stat infos_fichier; + if (stat(fname,&infos_fichier)) + return 0; + return infos_fichier.st_size; +#endif } -int File_length_file(FILE * file) + +unsigned long File_length_file(FILE * file) { - struct stat infos_fichier; - if (fstat(fileno(file),&infos_fichier)) - return 0; - return infos_fichier.st_size; +#if defined(WIN32) + // revert to old school way of finding file size + long offset_backup; + long file_length; + offset_backup = ftell(file); + fseek(file, 0, SEEK_END); + file_length = ftell(file); + fseek(file, offset_backup, SEEK_SET); + return (unsigned long)file_length; +#else + struct stat infos_fichier; + if (fstat(fileno(file),&infos_fichier)) + return 0; + return infos_fichier.st_size; +#endif } void For_each_file(const char * directory_name, void Callback(const char *, const char *)) @@ -683,3 +706,25 @@ int Change_directory(const char * path) return chdir(path); #endif } + +int Remove_path(const char * path) +{ +#if defined(WIN32) + return (DeleteFileA(path) ? 0 : -1); +#elif defined(__linux__) + return unlink(path); +#else + return remove(path); +#endif +} + +/// +/// Remove the directory +int Remove_directory(const char * path) +{ +#if defined(WIN32) + return RemoveDirectoryA(path) ? 0 : -1; +#else + return rmdir(path); +#endif +} \ No newline at end of file diff --git a/src/io.h b/src/io.h index 3c49cade..9475adf5 100644 --- a/src/io.h +++ b/src/io.h @@ -82,10 +82,10 @@ char * Find_last_separator(const char * str); #endif /// Size of a file, in bytes. Returns 0 in case of error. -int File_length(const char *fname); +unsigned long File_length(const char *fname); /// Size of a file, in bytes. Takes an open file as argument, returns 0 in case of error. -int File_length_file(FILE * file); +unsigned long File_length_file(FILE * file); /// Returns true if a file passed as a parameter exists in the current directory. int File_exists(const char * fname); @@ -135,3 +135,11 @@ const char * Get_current_directory(char * buf, word * buf_unicode, size_t size); /// /// Change current directory. return 0 for success, -1 in case of error int Change_directory(const char * path); + +/// +/// Remove the file +int Remove_path(const char * path); + +/// +/// Remove the directory +int Remove_directory(const char * path); diff --git a/src/loadsave.c b/src/loadsave.c index 19828f85..a7d17768 100644 --- a/src/loadsave.c +++ b/src/loadsave.c @@ -1941,5 +1941,5 @@ void Remove_file(T_IO_Context *context) Get_full_filename(filename, context->File_name, context->File_directory); - remove(filename); + Remove_path(filename); }