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

Side by Side Diff: base/file_util.cc

Issue 12620: Append a trailing slash on file directory URLs. Thus a link to /directory wil... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 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) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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_util.h" 5 #include "base/file_util.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include <fstream> 9 #include <fstream>
10 10
11 #include "base/file_path.h" 11 #include "base/file_path.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/string_util.h" 13 #include "base/string_util.h"
14 #include "unicode/uniset.h" 14 #include "unicode/uniset.h"
15 15
16 namespace file_util { 16 namespace file_util {
17 17
18 const wchar_t kExtensionSeparator = L'.'; 18 const wchar_t kExtensionSeparator = L'.';
19 19
20 void PathComponents(const std::wstring& path, 20 void PathComponents(const std::wstring& path,
21 std::vector<std::wstring>* components) { 21 std::vector<std::wstring>* components) {
22 DCHECK(components != NULL); 22 DCHECK(components != NULL);
23 if (components == NULL) 23 if (components == NULL)
24 return; 24 return;
25 std::wstring::size_type start = 0; 25 std::wstring::size_type start = 0;
26 std::wstring::size_type end = path.find(kPathSeparator, start); 26 std::wstring::size_type end = path.find(kPathSeparator, start);
27 27
28 // Special case the "/" or "\" directory. On Windows with a drive letter, 28 // Special case the "/" or "\" directory. On Windows with a drive letter,
29 // this code path won't hit, but the right thing should still happen. 29 // this code path won't hit, but the right thing should still happen.
30 // "E:\foo" will turn into "E:","foo". 30 // "E:\foo" will turn into "E:","foo".
31 if (end == start) { 31 if (end == start) {
32 components->push_back(std::wstring(path, 0, 1)); 32 components->push_back(std::wstring(path, 0, 1));
33 start = end + 1; 33 start = end + 1;
34 end = path.find(kPathSeparator, start); 34 end = path.find(kPathSeparator, start);
35 } 35 }
36 while (end != std::wstring::npos) { 36 while (end != std::wstring::npos) {
37 std::wstring component = std::wstring(path, start, end - start); 37 std::wstring component = std::wstring(path, start, end - start);
38 components->push_back(component); 38 components->push_back(component);
39 start = end + 1; 39 start = end + 1;
40 end = path.find(kPathSeparator, start); 40 end = path.find(kPathSeparator, start);
41 } 41 }
42 std::wstring component = std::wstring(path, start); 42 std::wstring component = std::wstring(path, start);
43 components->push_back(component); 43 components->push_back(component);
44 } 44 }
45 45
46 bool EndsWithSeparator(std::wstring* path) { 46 bool EndsWithSeparator(const FilePath& file_path) {
47 return EndsWithSeparator(*path); 47 std::wstring path = file_path.ToWStringHack();
48 bool is_sep = (path.length() > 0 &&
49 path[path.length() - 1] == kPathSeparator);
50 return is_sep;
48 } 51 }
49 52
50 bool EndsWithSeparator(const std::wstring& path) { 53 bool EnsureEndsWithSeparator(FilePath* path) {
51 bool is_sep = (path.length() > 0 && 54 if (!DirectoryExists(*path))
52 (path)[path.length() - 1] == kPathSeparator); 55 return false;
53 return is_sep; 56
57 if (EndsWithSeparator(*path))
58 return true;
59
60 FilePath::StringType& path_str =
61 const_cast<FilePath::StringType&>(path->value());
62 path_str.append(&FilePath::kSeparators[0], 1);
63
64 return true;
54 } 65 }
55 66
56 void TrimTrailingSeparator(std::wstring* dir) { 67 void TrimTrailingSeparator(std::wstring* dir) {
57 while (dir->length() > 1 && EndsWithSeparator(dir)) 68 while (dir->length() > 1 && EndsWithSeparator(dir))
58 dir->resize(dir->length() - 1); 69 dir->resize(dir->length() - 1);
59 } 70 }
60 71
61 void UpOneDirectory(std::wstring* dir) { 72 void UpOneDirectory(std::wstring* dir) {
62 TrimTrailingSeparator(dir); 73 TrimTrailingSeparator(dir);
63 74
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 bool AbsolutePath(std::wstring* path_str) { 319 bool AbsolutePath(std::wstring* path_str) {
309 FilePath path(FilePath::FromWStringHack(*path_str)); 320 FilePath path(FilePath::FromWStringHack(*path_str));
310 if (!AbsolutePath(&path)) 321 if (!AbsolutePath(&path))
311 return false; 322 return false;
312 *path_str = path.ToWStringHack(); 323 *path_str = path.ToWStringHack();
313 return true; 324 return true;
314 } 325 }
315 bool Delete(const std::wstring& path, bool recursive) { 326 bool Delete(const std::wstring& path, bool recursive) {
316 return Delete(FilePath::FromWStringHack(path), recursive); 327 return Delete(FilePath::FromWStringHack(path), recursive);
317 } 328 }
329 bool EndsWithSeparator(std::wstring* path) {
330 return EndsWithSeparator(FilePath::FromWStringHack(*path));
331 }
332 bool EndsWithSeparator(const std::wstring& path) {
333 return EndsWithSeparator(FilePath::FromWStringHack(path));
334 }
318 bool Move(const std::wstring& from_path, const std::wstring& to_path) { 335 bool Move(const std::wstring& from_path, const std::wstring& to_path) {
319 return Move(FilePath::FromWStringHack(from_path), 336 return Move(FilePath::FromWStringHack(from_path),
320 FilePath::FromWStringHack(to_path)); 337 FilePath::FromWStringHack(to_path));
321 } 338 }
322 bool CopyFile(const std::wstring& from_path, const std::wstring& to_path) { 339 bool CopyFile(const std::wstring& from_path, const std::wstring& to_path) {
323 return CopyFile(FilePath::FromWStringHack(from_path), 340 return CopyFile(FilePath::FromWStringHack(from_path),
324 FilePath::FromWStringHack(to_path)); 341 FilePath::FromWStringHack(to_path));
325 } 342 }
326 bool CopyDirectory(const std::wstring& from_path, const std::wstring& to_path, 343 bool CopyDirectory(const std::wstring& from_path, const std::wstring& to_path,
327 bool recursive) { 344 bool recursive) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 } 389 }
373 FILE* OpenFile(const std::wstring& filename, const char* mode) { 390 FILE* OpenFile(const std::wstring& filename, const char* mode) {
374 return OpenFile(FilePath::FromWStringHack(filename), mode); 391 return OpenFile(FilePath::FromWStringHack(filename), mode);
375 } 392 }
376 bool SetCurrentDirectory(const std::wstring& directory) { 393 bool SetCurrentDirectory(const std::wstring& directory) {
377 return SetCurrentDirectory(FilePath::FromWStringHack(directory)); 394 return SetCurrentDirectory(FilePath::FromWStringHack(directory));
378 } 395 }
379 396
380 } // namespace 397 } // namespace
381 398
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698