| 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; | 
| } | 
|  | 
|  |