From b63228c6759d09951c5303979bf3c7e97840a7c9 Mon Sep 17 00:00:00 2001 From: Nathan Phillips Date: Fri, 17 Mar 2017 10:59:21 +0000 Subject: [PATCH 1/2] delete_directory fails silently on subfolders --- src/util/file_util.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/util/file_util.cpp b/src/util/file_util.cpp index 5999d15ebfb..7cfea942a0c 100644 --- a/src/util/file_util.cpp +++ b/src/util/file_util.cpp @@ -107,7 +107,13 @@ void delete_directory(const std::string &path) struct dirent *ent; while((ent=readdir(dir))!=NULL) - remove((path+"/"+ent->d_name).c_str()); + { + std::string sub_path=path+"/"+ent->d_name; + if(ent->d_type==DT_DIR) + delete_directory(sub_path); + else + remove(sub_path.c_str()); + } closedir(dir); } From d110db0cb13de183c5860d5cad46d367d3272e15 Mon Sep 17 00:00:00 2001 From: Nathan Phillips Date: Tue, 21 Mar 2017 12:29:33 +0000 Subject: [PATCH 2/2] Version to work on Windows --- src/util/file_util.cpp | 50 ++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/util/file_util.cpp b/src/util/file_util.cpp index 7cfea942a0c..0a62549316e 100644 --- a/src/util/file_util.cpp +++ b/src/util/file_util.cpp @@ -26,6 +26,7 @@ Date: January 2012 #include #include #include +#include #define chdir _chdir #define popen _popen #define pclose _pclose @@ -79,33 +80,43 @@ Function: delete_directory \*******************************************************************/ -void delete_directory(const std::string &path) -{ - #ifdef _WIN32 - - std::string pattern=path+"\\*"; +#ifdef _WIN32 +void delete_directory_utf16(const std::wstring &path) +{ + std::wstring pattern=path + L"\\*"; // NOLINTNEXTLINE(readability/identifiers) - struct _finddata_t info; - - intptr_t handle=_findfirst(pattern.c_str(), &info); - - if(handle!=-1) + struct _wfinddata_t info; + intptr_t hFile=_wfindfirst(pattern.c_str(), &info); + if(hFile!=-1) { - unlink(info.name); - - while(_findnext(handle, &info)!=-1) - unlink(info.name); + do + { + if(wcscmp(info.name, L".")==0 || wcscmp(info.name, L"..")==0) + continue; + std::wstring sub_path=path+L"\\"+info.name; + if(info.attrib & _A_SUBDIR) + delete_directory_utf16(sub_path); + else + DeleteFileW(sub_path.c_str()); + } + while(_wfindnext(hFile, &info)==0); + _findclose(hFile); + RemoveDirectoryW(path.c_str()); } +} - #else +#endif +void delete_directory(const std::string &path) +{ +#ifdef _WIN32 + delete_directory_utf16(utf8_to_utf16_little_endian(path)); +#else DIR *dir=opendir(path.c_str()); - if(dir!=NULL) { struct dirent *ent; - while((ent=readdir(dir))!=NULL) { std::string sub_path=path+"/"+ent->d_name; @@ -114,13 +125,10 @@ void delete_directory(const std::string &path) else remove(sub_path.c_str()); } - closedir(dir); } - - #endif - rmdir(path.c_str()); +#endif } /*******************************************************************\