CString FileSystem::GetExeFileName(const char* argv0) { CString exename; exename.Reserve(1024 - 1); exename[1024 - 1] = '\0'; #ifdef WIN32 GetModuleFileName(nullptr, exename, 1024); #else // Linux int r = readlink("/proc/self/exe", exename, 1024 - 1); if (r > 0) { exename[r] = '\0'; return exename; } // FreeBSD r = readlink("/proc/curproc/file", exename, 1024 - 1); if (r > 0) { exename[r] = '\0'; return exename; } exename = ExpandFileName(argv0); #endif return exename; }
bool FileSystem::FlushFileBuffers(int fileDescriptor, CString& errmsg) { #ifdef WIN32 BOOL ok = ::FlushFileBuffers((HANDLE)_get_osfhandle(fileDescriptor)); if (!ok) { errmsg.Reserve(1024 - 1); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), errmsg, 1024, nullptr); } return ok; #else #ifdef HAVE_FULLFSYNC int ret = fcntl(fileDescriptor, F_FULLFSYNC) == -1 ? 1 : 0; #elif HAVE_FDATASYNC int ret = fdatasync(fileDescriptor); #else int ret = fsync(fileDescriptor); #endif if (ret != 0) { errmsg = GetLastErrorMessage(); } return ret == 0; #endif }
CString FileSystem::ExpandFileName(const char* filename) { #ifdef WIN32 wchar_t unistr[1024]; _wfullpath(unistr, UtfPathToWidePath(filename), 1024); return WidePathToUtfPath(unistr); #else CString result; result.Reserve(1024 - 1); if (filename[0] != '\0' && filename[0] != '/') { char curDir[MAX_PATH + 1]; getcwd(curDir, sizeof(curDir) - 1); // 1 char reserved for adding backslash int offset = 0; if (filename[0] == '.' && filename[1] == '/') { offset += 2; } result.Format("%s/%s", curDir, filename + offset); } else { result = filename; } return result; #endif }