| Index: base/file_util_posix.cc
|
| diff --git a/base/file_util_posix.cc b/base/file_util_posix.cc
|
| index e44064087edefaea186124c5ebd285677877a7b3..d48ae2ae686744bbd5a86f754d8fa4658e6f7de9 100644
|
| --- a/base/file_util_posix.cc
|
| +++ b/base/file_util_posix.cc
|
| @@ -18,6 +18,7 @@
|
| #include <fstream>
|
|
|
| #include "base/basictypes.h"
|
| +#include "base/file_path.h"
|
| #include "base/logging.h"
|
| #include "base/string_util.h"
|
|
|
| @@ -37,11 +38,11 @@ std::wstring GetDirectoryFromPath(const std::wstring& path) {
|
| }
|
| }
|
|
|
| -bool AbsolutePath(std::wstring* path) {
|
| +bool AbsolutePath(FilePath* path) {
|
| char full_path[PATH_MAX];
|
| - if (realpath(WideToUTF8(*path).c_str(), full_path) == NULL)
|
| + if (realpath(path->value().c_str(), full_path) == NULL)
|
| return false;
|
| - *path = UTF8ToWide(full_path);
|
| + *path = FilePath(full_path);
|
| return true;
|
| }
|
|
|
| @@ -49,25 +50,24 @@ bool AbsolutePath(std::wstring* path) {
|
| // which works both with and without the recursive flag. I'm not sure we need
|
| // that functionality. If not, remove from file_util_win.cc, otherwise add it
|
| // here.
|
| -bool Delete(const std::wstring& path, bool recursive) {
|
| - std::string utf8_path_string = WideToUTF8(path);
|
| - const char* utf8_path = utf8_path_string.c_str();
|
| +bool Delete(const FilePath& path, bool recursive) {
|
| + const char* path_str = path.value().c_str();
|
| struct stat64 file_info;
|
| - int test = stat64(utf8_path, &file_info);
|
| + int test = stat64(path_str, &file_info);
|
| if (test != 0) {
|
| // The Windows version defines this condition as success.
|
| bool ret = (errno == ENOENT || errno == ENOTDIR);
|
| return ret;
|
| }
|
| if (!S_ISDIR(file_info.st_mode))
|
| - return (unlink(utf8_path) == 0);
|
| + return (unlink(path_str) == 0);
|
| if (!recursive)
|
| - return (rmdir(utf8_path) == 0);
|
| + return (rmdir(path_str) == 0);
|
|
|
| bool success = true;
|
| int ftsflags = FTS_PHYSICAL | FTS_NOSTAT;
|
| char top_dir[PATH_MAX];
|
| - if (base::strlcpy(top_dir, utf8_path,
|
| + if (base::strlcpy(top_dir, path_str,
|
| arraysize(top_dir)) >= arraysize(top_dir)) {
|
| return false;
|
| }
|
| @@ -105,26 +105,23 @@ bool Delete(const std::wstring& path, bool recursive) {
|
| return success;
|
| }
|
|
|
| -bool Move(const std::wstring& from_path, const std::wstring& to_path) {
|
| - return (rename(WideToUTF8(from_path).c_str(),
|
| - WideToUTF8(to_path).c_str()) == 0);
|
| +bool Move(const FilePath& from_path, const FilePath& to_path) {
|
| + return (rename(from_path.value().c_str(),
|
| + to_path.value().c_str()) == 0);
|
| }
|
|
|
| -bool CopyDirectory(const std::wstring& from_path_wide,
|
| - const std::wstring& to_path_wide,
|
| +bool CopyDirectory(const FilePath& from_path,
|
| + const FilePath& to_path,
|
| bool recursive) {
|
| - const std::string to_path = WideToUTF8(to_path_wide);
|
| - const std::string from_path = WideToUTF8(from_path_wide);
|
| -
|
| // Some old callers of CopyDirectory want it to support wildcards.
|
| // After some discussion, we decided to fix those callers.
|
| // Break loudly here if anyone tries to do this.
|
| // TODO(evanm): remove this once we're sure it's ok.
|
| - DCHECK(to_path.find('*') == std::string::npos);
|
| - DCHECK(from_path.find('*') == std::string::npos);
|
| + DCHECK(to_path.value().find('*') == std::string::npos);
|
| + DCHECK(from_path.value().find('*') == std::string::npos);
|
|
|
| char top_dir[PATH_MAX];
|
| - if (base::strlcpy(top_dir, from_path.c_str(),
|
| + if (base::strlcpy(top_dir, from_path.value().c_str(),
|
| arraysize(top_dir)) >= arraysize(top_dir)) {
|
| return false;
|
| }
|
| @@ -141,7 +138,8 @@ bool CopyDirectory(const std::wstring& from_path_wide,
|
| while (!error && (ent = fts_read(fts)) != NULL) {
|
| // ent->fts_path is the source path, including from_path, so paste
|
| // the suffix after from_path onto to_path to create the target_path.
|
| - const std::string target_path = to_path + &ent->fts_path[from_path.size()];
|
| + const std::string target_path =
|
| + to_path.value() + &ent->fts_path[from_path.value().size()];
|
| switch (ent->fts_info) {
|
| case FTS_D: // Preorder directory.
|
| // If we encounter a subdirectory in a non-recursive copy, prune it
|
| @@ -211,14 +209,14 @@ bool CopyDirectory(const std::wstring& from_path_wide,
|
| return true;
|
| }
|
|
|
| -bool PathExists(const std::wstring& path) {
|
| +bool PathExists(const FilePath& path) {
|
| struct stat64 file_info;
|
| - return (stat64(WideToUTF8(path).c_str(), &file_info) == 0);
|
| + return (stat64(path.value().c_str(), &file_info) == 0);
|
| }
|
|
|
| -bool DirectoryExists(const std::wstring& path) {
|
| +bool DirectoryExists(const FilePath& path) {
|
| struct stat64 file_info;
|
| - if (stat64(WideToUTF8(path).c_str(), &file_info) == 0)
|
| + if (stat64(path.value().c_str(), &file_info) == 0)
|
| return S_ISDIR(file_info.st_mode);
|
| return false;
|
| }
|
| @@ -290,18 +288,23 @@ bool CreateNewTempDirectory(const std::wstring& prefix,
|
| return true;
|
| }
|
|
|
| -bool CreateDirectory(const std::wstring& full_path) {
|
| - std::vector<std::wstring> components;
|
| - PathComponents(full_path, &components);
|
| - std::wstring path;
|
| - std::vector<std::wstring>::iterator i = components.begin();
|
| - for (; i != components.end(); ++i) {
|
| - if (path.length() == 0)
|
| - path = *i;
|
| - else
|
| - AppendToPath(&path, *i);
|
| - if (!DirectoryExists(path)) {
|
| - if (mkdir(WideToUTF8(path).c_str(), 0777) != 0)
|
| +bool CreateDirectory(const FilePath& full_path) {
|
| + std::vector<FilePath> subpaths;
|
| +
|
| + // Collect a list of all parent directories.
|
| + FilePath last_path = full_path;
|
| + subpaths.push_back(full_path);
|
| + for (FilePath path = full_path.DirName();
|
| + path.value() != last_path.value(); path = path.DirName()) {
|
| + subpaths.push_back(path);
|
| + last_path = path;
|
| + }
|
| +
|
| + // Iterate through the parents and create the missing ones.
|
| + for (std::vector<FilePath>::reverse_iterator i = subpaths.rbegin();
|
| + i != subpaths.rend(); ++i) {
|
| + if (!DirectoryExists(*i)) {
|
| + if (mkdir(i->value().c_str(), 0777) != 0)
|
| return false;
|
| }
|
| }
|
| @@ -358,10 +361,13 @@ int WriteFile(const std::wstring& filename, const char* data, int size) {
|
| }
|
|
|
| // Gets the current working directory for the process.
|
| -bool GetCurrentDirectory(std::wstring* dir) {
|
| +bool GetCurrentDirectory(FilePath* dir) {
|
| char system_buffer[PATH_MAX] = "";
|
| - getcwd(system_buffer, sizeof(system_buffer));
|
| - *dir = UTF8ToWide(system_buffer);
|
| + if (!getcwd(system_buffer, sizeof(system_buffer))) {
|
| + NOTREACHED();
|
| + return false;
|
| + }
|
| + *dir = FilePath(system_buffer);
|
| return true;
|
| }
|
|
|
|
|