| Index: base/file_util.cc
|
| ===================================================================
|
| --- base/file_util.cc (revision 6039)
|
| +++ base/file_util.cc (working copy)
|
| @@ -13,41 +13,45 @@
|
| #include "base/string_util.h"
|
| #include "unicode/uniset.h"
|
|
|
| +#include "base/string_piece.h"
|
| +#include "base/sys_string_conversions.h"
|
| +
|
| namespace file_util {
|
|
|
| -const wchar_t kExtensionSeparator = L'.';
|
| -
|
| -void PathComponents(const std::wstring& path,
|
| - std::vector<std::wstring>* components) {
|
| - DCHECK(components != NULL);
|
| - if (components == NULL)
|
| +void PathComponents(const FilePath& path,
|
| + std::vector<FilePath::StringType>* components) {
|
| + DCHECK(components);
|
| + if (!components)
|
| return;
|
| - std::wstring::size_type start = 0;
|
| - std::wstring::size_type end = path.find(kPathSeparator, start);
|
|
|
| - // Special case the "/" or "\" directory. On Windows with a drive letter,
|
| - // this code path won't hit, but the right thing should still happen.
|
| - // "E:\foo" will turn into "E:","foo".
|
| + FilePath::StringType path_str = path.value();
|
| + FilePath::StringType::size_type start = 0;
|
| + FilePath::StringType::size_type end =
|
| + path_str.find_first_of(FilePath::kSeparators);
|
| +
|
| + // If the path starts with a separator, add it to components.
|
| if (end == start) {
|
| - components->push_back(std::wstring(path, 0, 1));
|
| + components->push_back(FilePath::StringType(path_str, 0, 1));
|
| start = end + 1;
|
| - end = path.find(kPathSeparator, start);
|
| + end = path_str.find_first_of(FilePath::kSeparators, start);
|
| }
|
| - while (end != std::wstring::npos) {
|
| - std::wstring component = std::wstring(path, start, end - start);
|
| + while (end != FilePath::StringType::npos) {
|
| + FilePath::StringType component =
|
| + FilePath::StringType(path_str, start, end - start);
|
| components->push_back(component);
|
| start = end + 1;
|
| - end = path.find(kPathSeparator, start);
|
| + end = path_str.find(FilePath::kSeparators, start);
|
| }
|
| - std::wstring component = std::wstring(path, start);
|
| - components->push_back(component);
|
| +
|
| + components->push_back(FilePath::StringType(path_str, start));
|
| }
|
|
|
| -bool EndsWithSeparator(const FilePath& file_path) {
|
| - std::wstring path = file_path.ToWStringHack();
|
| - bool is_sep = (path.length() > 0 &&
|
| - path[path.length() - 1] == kPathSeparator);
|
| - return is_sep;
|
| +bool EndsWithSeparator(const FilePath& path) {
|
| + FilePath::StringType value = path.value();
|
| + if (value.empty())
|
| + return false;
|
| +
|
| + return FilePath::IsSeparator(value[value.size() - 1]);
|
| }
|
|
|
| bool EnsureEndsWithSeparator(FilePath* path) {
|
| @@ -69,34 +73,6 @@
|
| dir->resize(dir->length() - 1);
|
| }
|
|
|
| -void UpOneDirectory(std::wstring* dir) {
|
| - TrimTrailingSeparator(dir);
|
| -
|
| - std::wstring::size_type last_sep = dir->find_last_of(kPathSeparator);
|
| - if (last_sep != std::wstring::npos)
|
| - dir->resize(last_sep);
|
| -}
|
| -
|
| -void UpOneDirectoryOrEmpty(std::wstring* dir) {
|
| - TrimTrailingSeparator(dir);
|
| -
|
| - std::wstring::size_type last_sep = dir->find_last_of(kPathSeparator);
|
| - if (last_sep != std::wstring::npos)
|
| - dir->resize(last_sep);
|
| - else
|
| - dir->clear();
|
| -}
|
| -
|
| -void TrimFilename(std::wstring* path) {
|
| - if (EndsWithSeparator(path)) {
|
| - TrimTrailingSeparator(path);
|
| - } else {
|
| - std::wstring::size_type last_sep = path->find_last_of(kPathSeparator);
|
| - if (last_sep != std::wstring::npos)
|
| - path->resize(last_sep);
|
| - }
|
| -}
|
| -
|
| std::wstring GetFilenameFromPath(const std::wstring& path) {
|
| // TODO(erikkay): fix this - it's not using kPathSeparator, but win unit test
|
| // are exercising '/' as a path separator as well.
|
| @@ -118,34 +94,6 @@
|
| return file_name.substr(0, last_dot);
|
| }
|
|
|
| -void AppendToPath(std::wstring* path, const std::wstring& new_ending) {
|
| - if (!path) {
|
| - NOTREACHED();
|
| - return; // Don't crash in this function in release builds.
|
| - }
|
| -
|
| - if (!EndsWithSeparator(path))
|
| - path->push_back(kPathSeparator);
|
| - path->append(new_ending);
|
| -}
|
| -
|
| -void InsertBeforeExtension(std::wstring* path, const std::wstring& suffix) {
|
| - DCHECK(path);
|
| -
|
| - const std::wstring::size_type last_dot = path->rfind(kExtensionSeparator);
|
| - const std::wstring::size_type last_sep = path->rfind(kPathSeparator);
|
| -
|
| - if (last_dot == std::wstring::npos ||
|
| - (last_sep != std::wstring::npos && last_dot < last_sep)) {
|
| - // The path looks something like "C:\pics.old\jojo" or "C:\pics\jojo".
|
| - // We should just append the suffix to the entire path.
|
| - path->append(suffix);
|
| - return;
|
| - }
|
| -
|
| - path->insert(last_dot, suffix);
|
| -}
|
| -
|
| void ReplaceIllegalCharacters(std::wstring* file_name, int replace_char) {
|
| DCHECK(file_name);
|
|
|
| @@ -216,39 +164,6 @@
|
| #endif
|
| }
|
|
|
| -// Appends the extension to file adding a '.' if extension doesn't contain one.
|
| -// This does nothing if extension is empty or '.'. This is used internally by
|
| -// ReplaceExtension.
|
| -static void AppendExtension(const std::wstring& extension,
|
| - std::wstring* file) {
|
| - if (!extension.empty() && extension != L".") {
|
| - if (extension[0] != L'.')
|
| - file->append(L".");
|
| - file->append(extension);
|
| - }
|
| -}
|
| -
|
| -void ReplaceExtension(std::wstring* file_name, const std::wstring& extension) {
|
| - const std::wstring::size_type last_dot = file_name->rfind(L'.');
|
| - if (last_dot == std::wstring::npos) {
|
| - // No extension, just append the supplied extension.
|
| - AppendExtension(extension, file_name);
|
| - return;
|
| - }
|
| - const std::wstring::size_type last_separator =
|
| - file_name->rfind(kPathSeparator);
|
| - if (last_separator != std::wstring::npos && last_dot < last_separator) {
|
| - // File name doesn't have extension, but one of the directories does; don't
|
| - // replace it, just append the supplied extension. For example
|
| - // 'c:\tmp.bar\foo'.
|
| - AppendExtension(extension, file_name);
|
| - return;
|
| - }
|
| - std::wstring result = file_name->substr(0, last_dot);
|
| - AppendExtension(extension, &result);
|
| - file_name->swap(result);
|
| -}
|
| -
|
| bool ContentsEqual(const FilePath& filename1, const FilePath& filename2) {
|
| // We open the file in binary format even if they are text files because
|
| // we are just comparing that bytes are exactly same in both files and not
|
| @@ -257,7 +172,7 @@
|
| std::ios::in | std::ios::binary);
|
| std::ifstream file2(filename2.value().c_str(),
|
| std::ios::in | std::ios::binary);
|
| -
|
| +
|
| // Even if both files aren't openable (and thus, in some sense, "equal"),
|
| // any unusable file yields a result of "false".
|
| if (!file1.is_open() || !file2.is_open())
|
| @@ -323,40 +238,31 @@
|
| *path_str = path.ToWStringHack();
|
| return true;
|
| }
|
| -bool Delete(const std::wstring& path, bool recursive) {
|
| - return Delete(FilePath::FromWStringHack(path), recursive);
|
| +void AppendToPath(std::wstring* path, const std::wstring& new_ending) {
|
| + if (!path) {
|
| + NOTREACHED();
|
| + return; // Don't crash in this function in release builds.
|
| + }
|
| +
|
| + if (!EndsWithSeparator(path))
|
| + path->push_back(FilePath::kSeparators[0]);
|
| + path->append(new_ending);
|
| }
|
| -bool EndsWithSeparator(std::wstring* path) {
|
| - return EndsWithSeparator(FilePath::FromWStringHack(*path));
|
| -}
|
| -bool EndsWithSeparator(const std::wstring& path) {
|
| - return EndsWithSeparator(FilePath::FromWStringHack(path));
|
| -}
|
| -bool Move(const std::wstring& from_path, const std::wstring& to_path) {
|
| - return Move(FilePath::FromWStringHack(from_path),
|
| - FilePath::FromWStringHack(to_path));
|
| -}
|
| -bool CopyFile(const std::wstring& from_path, const std::wstring& to_path) {
|
| - return CopyFile(FilePath::FromWStringHack(from_path),
|
| - FilePath::FromWStringHack(to_path));
|
| -}
|
| bool CopyDirectory(const std::wstring& from_path, const std::wstring& to_path,
|
| bool recursive) {
|
| return CopyDirectory(FilePath::FromWStringHack(from_path),
|
| FilePath::FromWStringHack(to_path),
|
| recursive);
|
| }
|
| -bool PathExists(const std::wstring& path) {
|
| - return PathExists(FilePath::FromWStringHack(path));
|
| -}
|
| -bool DirectoryExists(const std::wstring& path) {
|
| - return DirectoryExists(FilePath::FromWStringHack(path));
|
| -}
|
| bool ContentsEqual(const std::wstring& filename1,
|
| const std::wstring& filename2) {
|
| return ContentsEqual(FilePath::FromWStringHack(filename1),
|
| FilePath::FromWStringHack(filename2));
|
| }
|
| +bool CopyFile(const std::wstring& from_path, const std::wstring& to_path) {
|
| + return CopyFile(FilePath::FromWStringHack(from_path),
|
| + FilePath::FromWStringHack(to_path));
|
| +}
|
| bool CreateDirectory(const std::wstring& full_path) {
|
| return CreateDirectory(FilePath::FromWStringHack(full_path));
|
| }
|
| @@ -367,6 +273,18 @@
|
| *temp_file = temp_file_path.ToWStringHack();
|
| return true;
|
| }
|
| +bool Delete(const std::wstring& path, bool recursive) {
|
| + return Delete(FilePath::FromWStringHack(path), recursive);
|
| +}
|
| +bool DirectoryExists(const std::wstring& path) {
|
| + return DirectoryExists(FilePath::FromWStringHack(path));
|
| +}
|
| +bool EndsWithSeparator(std::wstring* path) {
|
| + return EndsWithSeparator(FilePath::FromWStringHack(*path));
|
| +}
|
| +bool EndsWithSeparator(const std::wstring& path) {
|
| + return EndsWithSeparator(FilePath::FromWStringHack(path));
|
| +}
|
| bool GetCurrentDirectory(std::wstring* path_str) {
|
| FilePath path;
|
| if (!GetCurrentDirectory(&path))
|
| @@ -387,12 +305,38 @@
|
| *path_str = path.ToWStringHack();
|
| return true;
|
| }
|
| +bool Move(const std::wstring& from_path, const std::wstring& to_path) {
|
| + return Move(FilePath::FromWStringHack(from_path),
|
| + FilePath::FromWStringHack(to_path));
|
| +}
|
| FILE* OpenFile(const std::wstring& filename, const char* mode) {
|
| return OpenFile(FilePath::FromWStringHack(filename), mode);
|
| }
|
| +bool PathExists(const std::wstring& path) {
|
| + return PathExists(FilePath::FromWStringHack(path));
|
| +}
|
| bool SetCurrentDirectory(const std::wstring& directory) {
|
| return SetCurrentDirectory(FilePath::FromWStringHack(directory));
|
| }
|
| +void TrimFilename(std::wstring* path) {
|
| + if (EndsWithSeparator(path)) {
|
| + TrimTrailingSeparator(path);
|
| + } else {
|
| + *path = FilePath::FromWStringHack(*path).DirName().ToWStringHack();
|
| + }
|
| +}
|
| +void UpOneDirectory(std::wstring* dir) {
|
| + FilePath path = FilePath::FromWStringHack(*dir);
|
| + *dir = path.DirName().ToWStringHack();
|
| +}
|
| +void UpOneDirectoryOrEmpty(std::wstring* dir) {
|
| + FilePath path = FilePath::FromWStringHack(*dir);
|
| + FilePath directory = path.DirName();
|
|
|
| + if (directory == path)
|
| + dir->clear();
|
| + else
|
| + *dir = directory.ToWStringHack();
|
| +}
|
| } // namespace
|
|
|
|
|