⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32filesystem.cc

📁 本人收集整理的一份c/c++跨平台网络库
💻 CC
字号:
#include <errno.h>#include <cassert>#include "basicdefs.h"#include "convert.h"#include "pathutils.h"#include "fileutils.h"#include "stringutils.h"#include "stream.h"#ifdef _WIN32#include "win32filesystem.h"namespace utils_base {bool Win32Filesystem::CreateFolderI(const Pathname &pathname) {  int len = (int)pathname.pathname().length();  if ((len <= 0) || (pathname.pathname().c_str()[len-1] != '\\')) {    return false;  }  DWORD res = ::GetFileAttributes(Utf16(pathname.pathname()).AsWz());  if (res != INVALID_FILE_ATTRIBUTES) {    // Something exists at this location, check if it is a directory    return ((res & FILE_ATTRIBUTE_DIRECTORY) != 0);  } else if ((GetLastError() != ERROR_FILE_NOT_FOUND)              && (GetLastError() != ERROR_PATH_NOT_FOUND)) {    // Unexpected error    return false;  }  // Directory doesn't exist, look up one directory level  do {    --len;  } while ((len > 0) && (pathname.pathname().c_str()[len-1] != '\\'));  if (!CreateFolder(std::string(pathname.pathname().c_str(),len)))    return false;  if (pathname.pathname().c_str()[0] != '\\') {	  std::string long_path = std::string("\\\\?\\") + pathname.pathname();	  return (::CreateDirectory(Utf16(long_path).AsWz(), NULL) != 0);  } else {    return (::CreateDirectory(Utf16(pathname.pathname()).AsWz(), NULL) != 0);  }}FileStream *Win32Filesystem::OpenFileI(const Pathname &filename, 			    const std::string &mode) {  utils_base::FileStream *fs = new utils_base::FileStream();  if (fs)    fs->Open(filename.pathname().c_str(), mode.c_str());  return fs;}bool Win32Filesystem::DeleteFileI(const Pathname &filename) {  LOG(LS_INFO) << "Deleting " << filename.pathname();   if (IsFolder(filename)) {     Pathname dir;     dir.SetFolder(filename.pathname());     DirectoryIterator di;     di.Iterate(dir.pathname());     while(di.Next()) {       if (di.Name() == "." || di.Name() == "..")	 continue;       Pathname subdir;       subdir.SetFolder(filename.pathname());       subdir.SetFilename(di.Name());             if (!DeleteFile(subdir.pathname()))	 return false;     }     std::string no_slash(filename.pathname(), 0, filename.pathname().length()-1);     return ::RemoveDirectory(Utf16(no_slash).AsWz()) == 0;   }    return ::DeleteFile(Utf16(filename.pathname()).AsWz()) == 0;}bool Win32Filesystem::GetTemporaryFolderI(Pathname &pathname, bool create,				    const std::string *append) { ASSERT(!g_application_name_.empty());  wchar_t buffer[MAX_PATH + 1];  if (!::GetTempPath(ARRAY_SIZE(buffer), buffer))    return false;  if (!::GetLongPathName(buffer, buffer, ARRAY_SIZE(buffer)))    return false;  size_t len = strlen(buffer);  if ((len > 0) && (buffer[len-1] != '\\')) {    len += utils_base::strcpyn(buffer + len, ARRAY_SIZE(buffer) - len,                              L"\\");  }  if ((len > 0) && (buffer[len-1] != '\\')) {    len += utils_base::strcpyn(buffer + len, ARRAY_SIZE(buffer) - len,                              L"\\");  }  if (len >= ARRAY_SIZE(buffer) - 1)    return false;  pathname.clear();  pathname.SetFolder(Utf8(buffer).AsSz());  if (append != NULL)    pathname.AppendFolder(*append);  if (create)    CreateFolderI(pathname);  return true;}std::string Win32Filesystem::TempFilenameI(const Pathname &dir, const std::string &prefix) {	wchar_t filename[MAX_PATH];	if (::GetTempFileName(Utf16(dir.pathname()).AsWz(), Utf16(prefix).AsWz(), 0, filename) == 0)		return Utf8(filename).AsString();	return "";}bool Win32Filesystem::MoveFileI(const Pathname &old_path, const Pathname &new_path) {  LOG(LS_INFO) << "Moving " << old_path.pathname() << " to " << new_path.pathname();  if (_wrename(Utf16(old_path.pathname()).AsWz(), Utf16(new_path.pathname()).AsWz()) != 0) {    if (errno != EXDEV) {      printf("errno: %d\n", errno);      return false;    }    if (!CopyFile(old_path, new_path))      return false;    if (!DeleteFile(old_path))      return false;  }  return true;}bool Win32Filesystem::IsFolderI(const Pathname &path){  WIN32_FILE_ATTRIBUTE_DATA data = {0};  if (0 == ::GetFileAttributesEx(Utf16(path.pathname()).AsWz(), GetFileExInfoStandard, &data))    return false;  return (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY;}bool Win32Filesystem::FileExistsI(const Pathname &path){  DWORD res = ::GetFileAttributes(Utf16(path.pathname()).AsWz());  return res != INVALID_FILE_ATTRIBUTES;}bool Win32Filesystem::CopyFileI(const Pathname &old_path, const Pathname &new_path) {  return ::CopyFile(Utf16(old_path.pathname()).AsWz(), Utf16(new_path.pathname()).AsWz(), TRUE) == 0;}bool Win32Filesystem::IsTemporaryPathI(const Pathname& pathname){  TCHAR buffer[MAX_PATH + 1];  if (!::GetTempPath(ARRAY_SIZE(buffer), buffer))    return false;  if (!::GetLongPathName(buffer, buffer, ARRAY_SIZE(buffer)))    return false;  return (::strnicmp(Utf16(pathname.pathname()).AsWz(), buffer, strlen(buffer)) == 0);}bool Win32Filesystem::GetFileSizeI(const Pathname &pathname, size_t *size){  WIN32_FILE_ATTRIBUTE_DATA data = {0};  if (::GetFileAttributesEx(Utf16(pathname.pathname()).AsWz(), GetFileExInfoStandard, &data) == 0)	  return false;  *size = data.nFileSizeLow;  return true;}}/// utils_base#endif // _WIN32

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -