From 21214f2860e1ba979081842d530ccf2f3d15d9fd Mon Sep 17 00:00:00 2001 From: x86kernel Date: Sun, 20 Dec 2015 02:19:53 +0000 Subject: [PATCH] some modifications about directory feature --- include/spdlog/details/file_helper.h | 80 ++++++++++++++++++++++++++-- include/spdlog/details/os.h | 76 ++++++++++---------------- 2 files changed, 104 insertions(+), 52 deletions(-) diff --git a/include/spdlog/details/file_helper.h b/include/spdlog/details/file_helper.h index 3a234897..73a7b79e 100644 --- a/include/spdlog/details/file_helper.h +++ b/include/spdlog/details/file_helper.h @@ -47,13 +47,17 @@ public: { close(); + std::list dirs; const char* mode = truncate ? "wb" : "ab"; _filename = fname; for (int tries = 0; tries < open_tries; ++tries) { - if (os::dir_check(fname, dirs)) - if(os::create_dirs(dirs)) + if (dir_check(fname)) + { + get_dirlist(fname, dirs); + if(create_dirs(dirs)) break; + } if(!os::fopen_s(&_fd, fname, mode)) return; @@ -133,11 +137,81 @@ public: return os::file_exists(name); } + //Return true if filenamd contains relative path + bool dir_check(const std::string &name) + { + std::string::size_type index = 0; + + index = name.find("/", index); + if(index != std::string::npos) + return true; + + return false; + } + + //Get list contain directories name + void get_dirlist(const std::string &name, std::list& dirs) + { + std::string directory; + std::string::size_type index, previndex = 0; + + index = name.find("/", previndex); + if(!index) + dirs.push_back("/"); + + do { + if(index - previndex == 0) + directory = name.substr(previndex, index - previndex + 1); + else + directory = name.substr(previndex, index - previndex); + + if(directory != "/") + dirs.push_back(directory); + + previndex = index + 1; + index = name.find("/", previndex); + }while(index != std::string::npos); + } + + + //Create directories by referring to list + //Return 0 if success + bool create_dirs(std::list& dirs) + { + std::string origin_path, dirname; + std::list::iterator li; + + int r; + + origin_path = os::getpwd(); + + for(li = dirs.begin(); li != dirs.end(); ++li) { + dirname = *li; + + r = os::_mkdir(dirname); + if(r) + { +#ifdef _WIN32 + //not yet +#else + if(os::get_lasterror() != EEXIST) + return r; +#endif + } + + r = os::_chdir(dirname); + if(r) return r; + } + + r = os::_chdir(origin_path); + if(r) return r; + + return 0; + } private: FILE* _fd; - std::list dirs; std::string _filename; bool _force_flush; diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index 8f1beadf..0b17ccb4 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -129,63 +129,41 @@ constexpr inline unsigned short eol_size() } #endif -//Return true and list if filename contains relative -inline bool dir_check(const std::string& filename, std::list& dirs) -{ -#ifdef __linux__ - std::string directory; - std::string::size_type index, previndex = 0, size; - - index = filename.find("/", previndex); - if(!index) - dirs.push_back("/"); - - do { - if(index - previndex == 0) - directory = filename.substr(previndex, index - previndex + 1); - else - directory = filename.substr(previndex, index - previndex); - - if(directory != "/") - dirs.push_back(directory); - - previndex = index + 1; - index = filename.find("/", previndex); - }while(index != std::string::npos); - - return true; +inline int get_lasterror() +{ +#ifdef _WIN32 + //not yet +#else + return errno; #endif - } -//Create directories by referring to list -//Return 0 if success -inline bool create_dirs(std::list& dirs) +inline std::string getpwd() { -#ifdef __linux__ - std::string origin_path; - std::list::iterator li; - - int r; - - origin_path = get_current_dir_name(); - for(li = dirs.begin(); li != dirs.end(); ++li) { - r = mkdir((*li).c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - if(r && errno != EEXIST) - return r; - - r = chdir((*li).c_str()); - if(r) return r; - } - - r = chdir(origin_path.c_str()); - if(r) return r; - - return 0; +#ifdef _WIN32 + //not yet +#else + return get_current_dir_name(); +#endif +} +inline bool _mkdir(const std::string& dirname) +{ +#ifdef _WIN32 + //not yet +#else + return mkdir(dirname.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); #endif +} +inline bool _chdir(const std::string& dirname) +{ +#ifdef _WIN32 + //not yet +#else + return chdir(dirname.c_str()); +#endif } //fopen_s on non windows for writing