Index: base/file_util.cc |
=================================================================== |
--- base/file_util.cc (revision 6271) |
+++ base/file_util.cc (working copy) |
@@ -16,6 +16,12 @@ |
#include "base/string_piece.h" |
#include "base/sys_string_conversions.h" |
+namespace { |
+ |
+const FilePath::CharType kExtensionSeparator = FILE_PATH_LITERAL('.'); |
+ |
+} |
+ |
namespace file_util { |
void PathComponents(const FilePath& path, |
@@ -73,13 +79,6 @@ |
dir->resize(dir->length() - 1); |
} |
-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. |
- std::wstring::size_type pos = path.find_last_of(L"\\/"); |
- return std::wstring(path, pos == std::wstring::npos ? 0 : pos + 1); |
-} |
- |
std::wstring GetFileExtensionFromPath(const std::wstring& path) { |
std::wstring file_name = GetFilenameFromPath(path); |
std::wstring::size_type last_dot = file_name.rfind(L'.'); |
@@ -94,6 +93,53 @@ |
return file_name.substr(0, last_dot); |
} |
+void InsertBeforeExtension(FilePath* path, const FilePath::StringType& suffix) { |
+ FilePath::StringType& value = |
+ const_cast<FilePath::StringType&>(path->value()); |
+ |
+ const FilePath::StringType::size_type last_dot = |
+ value.rfind(kExtensionSeparator); |
+ const FilePath::StringType::size_type last_separator = |
+ value.find_last_of(FilePath::StringType(FilePath::kSeparators)); |
+ |
+ if (last_dot == FilePath::StringType::npos || |
+ (last_separator != std::wstring::npos && last_dot < last_separator)) { |
+ // The path looks something like "C:\pics.old\jojo" or "C:\pics\jojo". |
+ // We should just append the suffix to the entire path. |
+ value.append(suffix); |
+ return; |
+ } |
+ |
+ value.insert(last_dot, suffix); |
+} |
+ |
+void ReplaceExtension(FilePath* path, const FilePath::StringType& extension) { |
+ FilePath::StringType clean_extension; |
+ // If the new extension is "" or ".", then we will just remove the current |
+ // extension. |
+ if (!extension.empty() && |
+ extension != FilePath::StringType(&kExtensionSeparator, 1)) { |
+ if (extension[0] != kExtensionSeparator) |
+ clean_extension.append(&kExtensionSeparator, 1); |
+ clean_extension.append(extension); |
+ } |
+ |
+ FilePath::StringType& value = |
+ const_cast<FilePath::StringType&>(path->value()); |
+ const FilePath::StringType::size_type last_dot = |
+ value.rfind(kExtensionSeparator); |
+ const FilePath::StringType::size_type last_separator = |
+ value.find_last_of(FilePath::StringType(FilePath::kSeparators)); |
+ |
+ // Erase the current extension, if any. |
+ if ((last_dot > last_separator || |
+ last_separator == FilePath::StringType::npos) && |
+ last_dot != FilePath::StringType::npos) |
+ value.erase(last_dot); |
+ |
+ value.append(clean_extension); |
+} |
+ |
void ReplaceIllegalCharacters(std::wstring* file_name, int replace_char) { |
DCHECK(file_name); |
@@ -295,6 +341,12 @@ |
bool GetFileInfo(const std::wstring& file_path, FileInfo* results) { |
return GetFileInfo(FilePath::FromWStringHack(file_path), results); |
} |
+std::wstring GetFilenameFromPath(const std::wstring& path) { |
+ if (path.empty() || EndsWithSeparator(path)) |
+ return std::wstring(); |
+ |
+ return FilePath::FromWStringHack(path).BaseName().ToWStringHack(); |
+} |
bool GetFileSize(const std::wstring& file_path, int64* file_size) { |
return GetFileSize(FilePath::FromWStringHack(file_path), file_size); |
} |