Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(207)

Side by Side Diff: base/file_path.cc

Issue 5754002: Moving away from shell api to support long path names on windows for filesystem. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/file_path.h" 5 #include "base/file_path.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <windows.h> 8 #include <windows.h>
9 #elif defined(OS_MACOSX) 9 #elif defined(OS_MACOSX)
10 #include <CoreFoundation/CoreFoundation.h> 10 #include <CoreFoundation/CoreFoundation.h>
(...skipping 16 matching lines...) Expand all
27 27
28 #if defined(FILE_PATH_USES_WIN_SEPARATORS) 28 #if defined(FILE_PATH_USES_WIN_SEPARATORS)
29 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("\\/"); 29 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("\\/");
30 #else // FILE_PATH_USES_WIN_SEPARATORS 30 #else // FILE_PATH_USES_WIN_SEPARATORS
31 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("/"); 31 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("/");
32 #endif // FILE_PATH_USES_WIN_SEPARATORS 32 #endif // FILE_PATH_USES_WIN_SEPARATORS
33 33
34 const FilePath::CharType FilePath::kCurrentDirectory[] = FILE_PATH_LITERAL("."); 34 const FilePath::CharType FilePath::kCurrentDirectory[] = FILE_PATH_LITERAL(".");
35 const FilePath::CharType FilePath::kParentDirectory[] = FILE_PATH_LITERAL(".."); 35 const FilePath::CharType FilePath::kParentDirectory[] = FILE_PATH_LITERAL("..");
36 36
37 #if defined(OS_WIN)
38 const FilePath::CharType FilePath::kExtendedPathPrefix[] =
39 FILE_PATH_LITERAL("\\\\?\\");
40
41 const FilePath::CharType FilePath::kUNCExtendedPathPrefix[] =
42 FILE_PATH_LITERAL("\\\\?\\UNC\\");
43
44 const FilePath::CharType FilePath::kSharePrefix[] =
45 FILE_PATH_LITERAL("\\\\");
46
47 const int kSharePrefixLength = 2;
kinuko 2010/12/22 23:20:49 arraysize(kSharePrefix) would also work.
Kavita Kanetkar 2010/12/23 03:14:28 Done.
48 #endif
49
37 const FilePath::CharType FilePath::kExtensionSeparator = FILE_PATH_LITERAL('.'); 50 const FilePath::CharType FilePath::kExtensionSeparator = FILE_PATH_LITERAL('.');
38 51
39 typedef FilePath::StringType StringType; 52 typedef FilePath::StringType StringType;
40 53
41 namespace { 54 namespace {
42 55
43 const char* kCommonDoubleExtensions[] = { "gz", "z", "bz2" }; 56 const char* kCommonDoubleExtensions[] = { "gz", "z", "bz2" };
44 57
45 // If this FilePath contains a drive letter specification, returns the 58 // If this FilePath contains a drive letter specification, returns the
46 // position of the last character of the drive letter specification, 59 // position of the last character of the drive letter specification,
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1183 1196
1184 #if defined(FILE_PATH_USES_WIN_SEPARATORS) 1197 #if defined(FILE_PATH_USES_WIN_SEPARATORS)
1185 FilePath FilePath::NormalizeWindowsPathSeparators() const { 1198 FilePath FilePath::NormalizeWindowsPathSeparators() const {
1186 StringType copy = path_; 1199 StringType copy = path_;
1187 for (size_t i = 1; i < arraysize(kSeparators); ++i) { 1200 for (size_t i = 1; i < arraysize(kSeparators); ++i) {
1188 std::replace(copy.begin(), copy.end(), kSeparators[i], kSeparators[0]); 1201 std::replace(copy.begin(), copy.end(), kSeparators[i], kSeparators[0]);
1189 } 1202 }
1190 return FilePath(copy); 1203 return FilePath(copy);
1191 } 1204 }
1192 #endif 1205 #endif
1206
1207 #if defined(OS_WIN)
1208 // TODO(kkanetkar): Taken from gears. Replace this when
kinuko 2010/12/22 23:20:49 'Replace this' may not correctly state what we wan
Kavita Kanetkar 2010/12/23 03:14:28 Done.
1209 // crbug.com/67384 is addressed.
1210 StringType FilePath::ToLongFileNameHack(const StringType& path) const {
1211 StringType long_path;
1212 // This cast is for countering the compiler warning.
1213 DWORD length_to_try = static_cast<DWORD>(path.length() * 2);
1214 long_path.resize(length_to_try);
1215 DWORD actual_length = GetLongPathName(path.c_str(),
1216 &long_path.at(0),
1217 length_to_try);
1218 if (actual_length == 0) {
1219 return path;
1220 } else if (actual_length <= length_to_try) {
1221 long_path.resize(actual_length);
1222 return long_path;
1223 }
1224
1225 length_to_try = actual_length;
1226 long_path.resize(length_to_try);
1227 actual_length = GetLongPathName(path.c_str(),
1228 &long_path.at(0),
1229 length_to_try + 1);
1230 if (actual_length > 0 && actual_length <= length_to_try) {
1231 long_path.resize(actual_length);
1232 return long_path;
1233 } else {
1234 return path;
1235 }
1236 }
1237
1238 FilePath FilePath::GetLongPathHack() const {
1239 if (StartsWith(path_, kExtendedPathPrefix, false) ||
1240 StartsWith(path_, kUNCExtendedPathPrefix, false)) {
1241 return FilePath(path_);
1242 }
1243
1244 // Note that the 8.3 short file name can not be simply prefixed with the long
1245 // path prefix. It has to be converted to long file name first.
1246 if (StartsWith(path_, kSharePrefix, false)) {
1247 return FilePath(kUNCExtendedPathPrefix + ToLongFileNameHack(
1248 path_.substr(kSharePrefixLength)));
1249 } else {
1250 return FilePath(kExtendedPathPrefix + ToLongFileNameHack(path_));
1251 }
1252 }
1253 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698