21 #if defined(__linux__) || \ 22 defined(__FreeBSD_kernel__) || \ 24 defined(__unix__) || \ 25 defined(__CYGWIN__) || \ 41 #define pclose _pclose 49 char *wd=realpath(
".",
nullptr);
51 wd!=
nullptr && errno==0,
52 std::string(
"realpath failed: ")+strerror(errno));
54 std::string working_directory=wd;
58 DWORD retval=GetCurrentDirectory(4096, buffer);
60 std::string working_directory(buffer);
63 return working_directory;
69 void delete_directory_utf16(
const std::wstring &path)
71 std::wstring pattern=path + L
"\\*";
73 struct _wfinddata_t info;
74 intptr_t hFile=_wfindfirst(pattern.c_str(), &info);
79 if(wcscmp(info.name, L
".")==0 || wcscmp(info.name, L
"..")==0)
81 std::wstring sub_path=path+L
"\\"+info.name;
82 if(info.attrib & _A_SUBDIR)
83 delete_directory_utf16(sub_path);
85 DeleteFileW(sub_path.c_str());
87 while(_wfindnext(hFile, &info)==0);
89 RemoveDirectoryW(path.c_str());
100 DIR *dir=opendir(path.c_str());
104 while((ent=readdir(dir))!=
nullptr)
107 if(strcmp(ent->d_name,
".")==0 || strcmp(ent->d_name,
"..")==0)
110 std::string sub_path=path+
"/"+ent->d_name;
113 int result=stat(sub_path.c_str(), &stbuf);
115 throw std::string(
"Stat failed: ")+std::strerror(errno);
117 if(S_ISDIR(stbuf.st_mode))
121 result=
remove(sub_path.c_str());
123 throw std::string(
"Remove failed: ")+std::strerror(errno);
135 const std::string &directory,
136 const std::string &file_name)
139 return (file_name.size()>1 &&
142 file_name : directory+
"\\"+file_name;
144 return (!file_name.empty() && file_name[0]==
'/') ?
145 file_name : directory+
"/"+file_name;
std::string concat_dir_file(const std::string &directory, const std::string &file_name)
#define CHECK_RETURN(CONDITION)
std::string get_current_working_directory()
#define INVARIANT(CONDITION, REASON)
void delete_directory(const std::string &path)
deletes all files in 'path' and then the directory itself
std::wstring utf8_to_utf16_little_endian(const std::string &in)