Index: base/files/file_path.cc |
diff --git a/base/files/file_path.cc b/base/files/file_path.cc |
index 407ec855b2d7ad06273715e51313fb7275285f3c..a96c710bcbfd873387685b5b3abdc61824221020 100644 |
--- a/base/files/file_path.cc |
+++ b/base/files/file_path.cc |
@@ -16,6 +16,7 @@ |
#include "base/string_piece.h" |
#include "base/string_util.h" |
#include "base/strings/sys_string_conversions.h" |
+#include "base/threading/thread_restrictions.h" |
#include "base/utf_string_conversions.h" |
#if defined(OS_MACOSX) |
@@ -521,6 +522,45 @@ bool FilePath::IsAbsolute() const { |
return IsPathAbsolute(path_); |
} |
+FilePath FilePath::AsAbsolute() const { |
+ base::ThreadRestrictions::AssertIOAllowed(); |
+ |
+#if defined(OS_WIN) |
+ wchar_t file_path[MAX_PATH]; |
+ if (!_wfullpath(file_path, path_.c_str(), MAX_PATH)) |
+ return FilePath(); |
+ return FilePath(file_path); |
+#elif defined(OS_NACL) |
+ // Nacl doesn't have realpath and there's not a lot you can do inside the |
+ // sandbox with files. |
+ // TODO(brettw) implement something more reasonable if we need it. |
+ return *this; |
+#elif defined(OS_POSIX) |
+ char full_path[PATH_MAX]; |
+ if (realpath(path_.c_str(), full_path) == NULL) |
+ return FilePath(); |
+ return FilePath(full_path); |
+#endif |
+} |
+ |
+bool FilePath::EndsWithSeparator() const { |
+ if (empty()) |
+ return false; |
+ return IsSeparator(path_[path_.size() - 1]); |
+} |
+ |
+FilePath FilePath::AsEndingWithSeparator() const { |
+ if (EndsWithSeparator()) |
+ return *this; |
+ |
+ StringType path_str; |
+ path_str.reserve(path_.length() + 1); // Only allocate string once. |
+ |
+ path_str = path_; |
+ path_str.append(&kSeparators[0], 1); |
+ return FilePath(path_str); |
+} |
+ |
FilePath FilePath::StripTrailingSeparators() const { |
FilePath new_path(path_); |
new_path.StripTrailingSeparatorsInternal(); |