OLD | NEW |
---|---|
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 Loading... | |
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 #endif | |
47 | |
37 const FilePath::CharType FilePath::kExtensionSeparator = FILE_PATH_LITERAL('.'); | 48 const FilePath::CharType FilePath::kExtensionSeparator = FILE_PATH_LITERAL('.'); |
38 | 49 |
39 typedef FilePath::StringType StringType; | 50 typedef FilePath::StringType StringType; |
40 | 51 |
41 namespace { | 52 namespace { |
42 | 53 |
43 const char* kCommonDoubleExtensions[] = { "gz", "z", "bz2" }; | 54 const char* kCommonDoubleExtensions[] = { "gz", "z", "bz2" }; |
44 | 55 |
45 // If this FilePath contains a drive letter specification, returns the | 56 // If this FilePath contains a drive letter specification, returns the |
46 // position of the last character of the drive letter specification, | 57 // position of the last character of the drive letter specification, |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
148 (last_separator == StringType::npos || | 159 (last_separator == StringType::npos || |
149 penultimate_dot > last_separator) && | 160 penultimate_dot > last_separator) && |
150 last_dot - penultimate_dot <= 5U && | 161 last_dot - penultimate_dot <= 5U && |
151 last_dot - penultimate_dot > 1U) { | 162 last_dot - penultimate_dot > 1U) { |
152 return penultimate_dot; | 163 return penultimate_dot; |
153 } | 164 } |
154 | 165 |
155 return last_dot; | 166 return last_dot; |
156 } | 167 } |
157 | 168 |
169 #if defined(OS_WIN) | |
170 // TODO(kkanetkar): Taken from gears. When crbug.com/67384 is addressed | |
171 // this logic will be used in a different way such that the callers | |
172 // would not be aware of the extended path or UNC formats. | |
173 StringType ToLongFileNameHack(const FilePath::StringType& path) { | |
174 StringType long_path; | |
175 // This cast is for countering the compiler warning. | |
176 DWORD length_to_try = static_cast<DWORD>(path.length() * 2); | |
Erik does not do reviews
2010/12/23 17:57:27
I don't understand this *2 logic. Why not just pa
| |
177 long_path.resize(length_to_try); | |
178 DWORD actual_length = GetLongPathName(path.c_str(), | |
179 &long_path.at(0), | |
180 length_to_try); | |
181 if (actual_length == 0) { | |
182 return path; | |
Erik does not do reviews
2010/12/23 17:57:27
I'm a bit nervous that this won't work in all case
| |
183 } else if (actual_length <= length_to_try) { | |
184 long_path.resize(actual_length); | |
185 return long_path; | |
186 } | |
187 | |
188 length_to_try = actual_length; | |
189 long_path.resize(length_to_try); | |
190 actual_length = GetLongPathName(path.c_str(), | |
191 &long_path.at(0), | |
192 length_to_try + 1); | |
193 if (actual_length > 0 && actual_length <= length_to_try) { | |
194 long_path.resize(actual_length); | |
195 return long_path; | |
196 } else { | |
197 return path; | |
198 } | |
199 } | |
200 #endif | |
201 | |
158 } // namespace | 202 } // namespace |
159 | 203 |
160 FilePath::FilePath() { | 204 FilePath::FilePath() { |
161 } | 205 } |
162 | 206 |
163 FilePath::FilePath(const FilePath& that) : path_(that.path_) { | 207 FilePath::FilePath(const FilePath& that) : path_(that.path_) { |
164 } | 208 } |
165 | 209 |
166 FilePath::FilePath(const StringType& path) : path_(path) { | 210 FilePath::FilePath(const StringType& path) : path_(path) { |
167 } | 211 } |
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1183 | 1227 |
1184 #if defined(FILE_PATH_USES_WIN_SEPARATORS) | 1228 #if defined(FILE_PATH_USES_WIN_SEPARATORS) |
1185 FilePath FilePath::NormalizeWindowsPathSeparators() const { | 1229 FilePath FilePath::NormalizeWindowsPathSeparators() const { |
1186 StringType copy = path_; | 1230 StringType copy = path_; |
1187 for (size_t i = 1; i < arraysize(kSeparators); ++i) { | 1231 for (size_t i = 1; i < arraysize(kSeparators); ++i) { |
1188 std::replace(copy.begin(), copy.end(), kSeparators[i], kSeparators[0]); | 1232 std::replace(copy.begin(), copy.end(), kSeparators[i], kSeparators[0]); |
1189 } | 1233 } |
1190 return FilePath(copy); | 1234 return FilePath(copy); |
1191 } | 1235 } |
1192 #endif | 1236 #endif |
1237 | |
1238 #if defined(OS_WIN) | |
1239 FilePath FilePath::GetLongPathHack() const { | |
1240 if (StartsWith(path_, kExtendedPathPrefix, false) || | |
Erik does not do reviews
2010/12/23 17:57:27
why not call StartsWithExtendedPathOrUNCPrefix?
| |
1241 StartsWith(path_, kUNCExtendedPathPrefix, false)) { | |
1242 return FilePath(path_); | |
1243 } | |
1244 | |
1245 // Note that the 8.3 short file name can not be simply prefixed with the long | |
1246 // path prefix. It has to be converted to long file name first. | |
1247 if (StartsWith(path_, kSharePrefix, false)) { | |
1248 return FilePath(kUNCExtendedPathPrefix + ToLongFileNameHack( | |
1249 path_.substr(arraysize(FilePath::kSharePrefix) - 1))); | |
1250 } else { | |
1251 return FilePath(kExtendedPathPrefix + ToLongFileNameHack(path_)); | |
1252 } | |
1253 } | |
1254 #endif | |
1255 | |
1256 #if defined(OS_WIN) | |
1257 bool FilePath::StartsWithExtendedPathOrUNCPrefix() const { | |
1258 return StartsWith(path_, kExtendedPathPrefix, false) || | |
1259 StartsWith(path_, kUNCExtendedPathPrefix, false); | |
1260 } | |
1261 #endif | |
OLD | NEW |