21 #if defined(__linux__) || \
22 defined(__FreeBSD_kernel__) || \
24 defined(__unix__) || \
25 defined(__CYGWIN__) || \
35 #include <util/pragma_push.def>
37 #pragma warning(disable:4668)
39 #pragma warning(disable : 5039)
47 #include <util/pragma_pop.def>
55 char *wd=realpath(
".",
nullptr);
57 if(wd ==
nullptr || errno != 0)
59 std::string(
"realpath failed: ") + std::strerror(errno));
61 std::string working_directory=wd;
65 DWORD retval=GetCurrentDirectory(4096, buffer);
70 std::string working_directory(
narrow(buffer));
72 std::string working_directory(buffer);
77 return working_directory;
84 if(chdir(path.c_str()) != 0)
86 std::string(
"chdir failed: ") + std::strerror(errno));
92 void delete_directory_utf16(
const std::wstring &path)
94 std::wstring pattern=path + L
"\\*";
96 struct _wfinddata_t info;
97 intptr_t hFile=_wfindfirst(pattern.c_str(), &info);
102 if(wcscmp(info.name, L
".")==0 || wcscmp(info.name, L
"..")==0)
104 std::wstring sub_path=path+L
"\\"+info.name;
105 if(info.attrib & _A_SUBDIR)
106 delete_directory_utf16(sub_path);
108 DeleteFileW(sub_path.c_str());
110 while(_wfindnext(hFile, &info)==0);
112 RemoveDirectoryW(path.c_str());
123 DIR *dir=opendir(path.c_str());
127 while((ent=readdir(dir))!=
nullptr)
130 if(strcmp(ent->d_name,
".")==0 || strcmp(ent->d_name,
"..")==0)
133 std::string sub_path=path+
"/"+ent->d_name;
136 int result=stat(sub_path.c_str(), &stbuf);
139 std::string(
"Stat failed: ") + std::strerror(errno));
141 if(S_ISDIR(stbuf.st_mode))
145 result=remove(sub_path.c_str());
148 std::string(
"Remove failed: ") + std::strerror(errno));
160 const std::string &directory,
161 const std::string &file_name)
164 return (file_name.size() > 1 && file_name[0] !=
'/' && file_name[1] ==
':') ?
165 file_name : directory +
"\\" + file_name;
167 return (!file_name.empty() && file_name[0]==
'/') ?
168 file_name : directory+
"/"+file_name;
179 auto attributes = ::GetFileAttributesW(
widen(path).c_str());
180 if (attributes == INVALID_FILE_ATTRIBUTES)
183 return (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
189 if(stat(path.c_str(), &buf)!=0)
192 return (buf.st_mode & S_IFDIR) != 0;
200 return _mkdir(path.c_str()) == 0;
203 return mkdir(path.c_str(), 0777) == 0;