Index: base/file_util_win.cc |
=================================================================== |
--- base/file_util_win.cc (revision 6039) |
+++ base/file_util_win.cc (working copy) |
@@ -19,7 +19,13 @@ |
namespace file_util { |
const wchar_t kPathSeparator = L'\\'; |
+const wchar_t kExtensionSeparator = L'.'; |
+void PathComponents(const std::wstring& path, |
+ std::vector<std::wstring>* components) { |
+ PathComponents(FilePath(path), components); |
+} |
+ |
std::wstring GetDirectoryFromPath(const std::wstring& path) { |
wchar_t path_buffer[MAX_PATH]; |
wchar_t* file_ptr = NULL; |
@@ -40,7 +46,56 @@ |
*path = FilePath(file_path_buf); |
return true; |
} |
- |
+ |
+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); |
+} |
+ |
+// 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); |
+} |
int CountFilesCreatedAfter(const std::wstring& path, |
const FILETIME& comparison_time) { |
int file_count = 0; |