diff options
Diffstat (limited to 'base/file_util_win.cc')
-rw-r--r-- | base/file_util_win.cc | 93 |
1 files changed, 56 insertions, 37 deletions
diff --git a/base/file_util_win.cc b/base/file_util_win.cc index 9d775f0..2a08f55 100644 --- a/base/file_util_win.cc +++ b/base/file_util_win.cc @@ -10,6 +10,7 @@ #include <time.h> #include <string> +#include "base/file_path.h" #include "base/logging.h" #include "base/scoped_handle.h" #include "base/string_util.h" @@ -32,11 +33,11 @@ std::wstring GetDirectoryFromPath(const std::wstring& path) { return directory; } -bool AbsolutePath(std::wstring* path) { +bool AbsolutePath(FilePath* path) { wchar_t file_path_buf[MAX_PATH]; - if (!_wfullpath(file_path_buf, path->c_str(), MAX_PATH)) + if (!_wfullpath(file_path_buf, path->value().c_str(), MAX_PATH)) return false; - *path = file_path_buf; + *path = FilePath(file_path_buf); return true; } @@ -66,14 +67,14 @@ int CountFilesCreatedAfter(const std::wstring& path, return file_count; } -bool Delete(const std::wstring& path, bool recursive) { - if (path.length() >= MAX_PATH) +bool Delete(const FilePath& path, bool recursive) { + if (path.value().length() >= MAX_PATH) return false; // If we're not recursing use DeleteFile; it should be faster. DeleteFile // fails if passed a directory though, which is why we fall through on // failure to the SHFileOperation. - if (!recursive && DeleteFile(path.c_str()) != 0) + if (!recursive && DeleteFile(path.value().c_str()) != 0) return true; // SHFILEOPSTRUCT wants the path to be terminated with two NULLs, @@ -81,7 +82,7 @@ bool Delete(const std::wstring& path, bool recursive) { // into the rest of the buffer. wchar_t double_terminated_path[MAX_PATH + 1] = {0}; #pragma warning(suppress:4996) // don't complain about wcscpy deprecation - wcscpy(double_terminated_path, path.c_str()); + wcscpy(double_terminated_path, path.value().c_str()); SHFILEOPSTRUCT file_operation = {0}; file_operation.wFunc = FO_DELETE; @@ -92,29 +93,36 @@ bool Delete(const std::wstring& path, bool recursive) { return (SHFileOperation(&file_operation) == 0); } -bool Move(const std::wstring& from_path, const std::wstring& to_path) { +bool Move(const FilePath& from_path, const FilePath& to_path) { // NOTE: I suspect we could support longer paths, but that would involve // analyzing all our usage of files. - if (from_path.length() >= MAX_PATH || to_path.length() >= MAX_PATH) + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { return false; - return (MoveFileEx(from_path.c_str(), to_path.c_str(), + } + return (MoveFileEx(from_path.value().c_str(), to_path.value().c_str(), MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) != 0); } -bool CopyFile(const std::wstring& from_path, const std::wstring& to_path) { +bool CopyFile(const FilePath& from_path, const FilePath& to_path) { // NOTE: I suspect we could support longer paths, but that would involve // analyzing all our usage of files. - if (from_path.length() >= MAX_PATH || to_path.length() >= MAX_PATH) + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { return false; - return (::CopyFile(from_path.c_str(), to_path.c_str(), false) != 0); + } + return (::CopyFile(from_path.value().c_str(), to_path.value().c_str(), + false) != 0); } -bool ShellCopy(const std::wstring& from_path, const std::wstring& to_path, +bool ShellCopy(const FilePath& from_path, const FilePath& to_path, bool recursive) { // NOTE: I suspect we could support longer paths, but that would involve // analyzing all our usage of files. - if (from_path.length() >= MAX_PATH || to_path.length() >= MAX_PATH) + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { return false; + } // SHFILEOPSTRUCT wants the path to be terminated with two NULLs, // so we have to use wcscpy because wcscpy_s writes non-NULLs @@ -122,9 +130,9 @@ bool ShellCopy(const std::wstring& from_path, const std::wstring& to_path, wchar_t double_terminated_path_from[MAX_PATH + 1] = {0}; wchar_t double_terminated_path_to[MAX_PATH + 1] = {0}; #pragma warning(suppress:4996) // don't complain about wcscpy deprecation - wcscpy(double_terminated_path_from, from_path.c_str()); + wcscpy(double_terminated_path_from, from_path.value().c_str()); #pragma warning(suppress:4996) // don't complain about wcscpy deprecation - wcscpy(double_terminated_path_to, to_path.c_str()); + wcscpy(double_terminated_path_to, to_path.value().c_str()); SHFILEOPSTRUCT file_operation = {0}; file_operation.wFunc = FO_COPY; @@ -138,7 +146,7 @@ bool ShellCopy(const std::wstring& from_path, const std::wstring& to_path, return (SHFileOperation(&file_operation) == 0); } -bool CopyDirectory(const std::wstring& from_path, const std::wstring& to_path, +bool CopyDirectory(const FilePath& from_path, const FilePath& to_path, bool recursive) { if (recursive) return ShellCopy(from_path, to_path, true); @@ -154,13 +162,12 @@ bool CopyDirectory(const std::wstring& from_path, const std::wstring& to_path, ShellCopy(from_path, to_path, false); } - std::wstring directory(from_path); - AppendToPath(&directory, L"*.*"); + FilePath directory = from_path.Append(L"*.*"); return ShellCopy(directory, to_path, false); } -bool PathExists(const std::wstring& path) { - return (GetFileAttributes(path.c_str()) != INVALID_FILE_ATTRIBUTES); +bool PathExists(const FilePath& path) { + return (GetFileAttributes(path.value().c_str()) != INVALID_FILE_ATTRIBUTES); } bool PathIsWritable(const std::wstring& path) { @@ -176,8 +183,8 @@ bool PathIsWritable(const std::wstring& path) { return true; } -bool DirectoryExists(const std::wstring& path) { - DWORD fileattr = GetFileAttributes(path.c_str()); +bool DirectoryExists(const FilePath& path) { + DWORD fileattr = GetFileAttributes(path.value().c_str()); if (fileattr != INVALID_FILE_ATTRIBUTES) return (fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0; return false; @@ -372,13 +379,17 @@ bool IsDirectoryEmpty(const std::wstring& dir_path) { return false; } -bool GetTempDir(std::wstring* path) { +bool GetTempDir(FilePath* path) { wchar_t temp_path[MAX_PATH + 1]; DWORD path_len = ::GetTempPath(MAX_PATH, temp_path); if (path_len >= MAX_PATH || path_len <= 0) return false; - path->assign(temp_path); - TrimTrailingSeparator(path); + // TODO(evanm): the old behavior of this function was to always strip the + // trailing slash. We duplicate this here, but it shouldn't be necessary + // when everyone is using the appropriate FilePath APIs. + std::wstring path_str(temp_path); + TrimTrailingSeparator(&path_str); + *path = FilePath(path_str); return true; } @@ -438,10 +449,10 @@ bool CreateNewTempDirectory(const std::wstring& prefix, return true; } -bool CreateDirectory(const std::wstring& full_path) { +bool CreateDirectory(const FilePath& full_path) { if (DirectoryExists(full_path)) return true; - int err = SHCreateDirectoryEx(NULL, full_path.c_str(), NULL); + int err = SHCreateDirectoryEx(NULL, full_path.value().c_str(), NULL); return err == ERROR_SUCCESS; } @@ -460,23 +471,27 @@ bool GetFileInfo(const std::wstring& file_path, FileInfo* results) { return true; } -FILE* OpenFile(const std::string& filename, const char* mode) { +FILE* OpenFile(const FilePath& filename, const char* mode) { + std::wstring w_mode = ASCIIToWide(std::string(mode)); FILE* file; - if (fopen_s(&file, filename.c_str(), mode) != 0) { + if (_wfopen_s(&file, filename.value().c_str(), w_mode.c_str()) != 0) { return NULL; } return file; } -FILE* OpenFile(const std::wstring& filename, const char* mode) { - std::wstring w_mode = ASCIIToWide(std::string(mode)); +FILE* OpenFile(const std::string& filename, const char* mode) { FILE* file; - if (_wfopen_s(&file, filename.c_str(), w_mode.c_str()) != 0) { + if (fopen_s(&file, filename.c_str(), mode) != 0) { return NULL; } return file; } +FILE* OpenFile(const std::wstring& filename, const char* mode) { + return OpenFile(FilePath(filename), mode); +} + int ReadFile(const std::wstring& filename, char* data, int size) { ScopedHandle file(CreateFile(filename.c_str(), GENERIC_READ, @@ -556,14 +571,18 @@ bool RenameFileAndResetSecurityDescriptor( } // Gets the current working directory for the process. -bool GetCurrentDirectory(std::wstring* dir) { +bool GetCurrentDirectory(FilePath* dir) { wchar_t system_buffer[MAX_PATH]; system_buffer[0] = 0; DWORD len = ::GetCurrentDirectory(MAX_PATH, system_buffer); if (len == 0 || len > MAX_PATH) return false; - *dir = system_buffer; - file_util::TrimTrailingSeparator(dir); + // TODO(evanm): the old behavior of this function was to always strip the + // trailing slash. We duplicate this here, but it shouldn't be necessary + // when everyone is using the appropriate FilePath APIs. + std::wstring dir_str(system_buffer); + file_util::TrimTrailingSeparator(&dir_str); + *dir = FilePath(dir_str); return true; } |