| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // This file contains utility functions for dealing with the local | 5 // This file contains utility functions for dealing with the local |
| 6 // filesystem. | 6 // filesystem. |
| 7 | 7 |
| 8 #ifndef BASE_FILE_UTIL_H_ | 8 #ifndef BASE_FILE_UTIL_H_ |
| 9 #define BASE_FILE_UTIL_H_ | 9 #define BASE_FILE_UTIL_H_ |
| 10 | 10 |
| 11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 | 12 |
| 13 #if defined(OS_WIN) | 13 #if defined(OS_WIN) |
| 14 #include <windows.h> | 14 #include <windows.h> |
| 15 #elif defined(OS_POSIX) | 15 #elif defined(OS_POSIX) |
| 16 #include <sys/stat.h> | 16 #include <sys/stat.h> |
| 17 #include <unistd.h> | 17 #include <unistd.h> |
| 18 #endif | 18 #endif |
| 19 | 19 |
| 20 #include <stdio.h> | 20 #include <stdio.h> |
| 21 | 21 |
| 22 #include <set> | 22 #include <set> |
| 23 #include <stack> | |
| 24 #include <string> | 23 #include <string> |
| 25 #include <vector> | 24 #include <vector> |
| 26 | 25 |
| 27 #include "base/base_export.h" | 26 #include "base/base_export.h" |
| 28 #include "base/basictypes.h" | 27 #include "base/basictypes.h" |
| 29 #include "base/files/file_path.h" | 28 #include "base/files/file_path.h" |
| 30 #include "base/memory/scoped_ptr.h" | 29 #include "base/memory/scoped_ptr.h" |
| 31 #include "base/platform_file.h" | 30 #include "base/platform_file.h" |
| 32 #include "base/string16.h" | 31 #include "base/string16.h" |
| 33 | 32 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 BASE_EXPORT bool CopyFile(const base::FilePath& from_path, | 115 BASE_EXPORT bool CopyFile(const base::FilePath& from_path, |
| 117 const base::FilePath& to_path); | 116 const base::FilePath& to_path); |
| 118 | 117 |
| 119 // Same as CopyFile but allows paths with traversal components. | 118 // Same as CopyFile but allows paths with traversal components. |
| 120 // Use only with extreme care. | 119 // Use only with extreme care. |
| 121 BASE_EXPORT bool CopyFileUnsafe(const base::FilePath& from_path, | 120 BASE_EXPORT bool CopyFileUnsafe(const base::FilePath& from_path, |
| 122 const base::FilePath& to_path); | 121 const base::FilePath& to_path); |
| 123 | 122 |
| 124 // Copies the given path, and optionally all subdirectories and their contents | 123 // Copies the given path, and optionally all subdirectories and their contents |
| 125 // as well. | 124 // as well. |
| 126 // If there are files existing under to_path, always overwrite. | 125 // |
| 127 // Returns true if successful, false otherwise. | 126 // If there are files existing under to_path, always overwrite. Returns true |
| 128 // Don't use wildcards on the names, it may stop working without notice. | 127 // if successful, false otherwise. Wildcards on the names are not supported. |
| 129 // | 128 // |
| 130 // If you only need to copy a file use CopyFile, it's faster. | 129 // If you only need to copy a file use CopyFile, it's faster. |
| 131 BASE_EXPORT bool CopyDirectory(const base::FilePath& from_path, | 130 BASE_EXPORT bool CopyDirectory(const base::FilePath& from_path, |
| 132 const base::FilePath& to_path, | 131 const base::FilePath& to_path, |
| 133 bool recursive); | 132 bool recursive); |
| 134 | 133 |
| 135 // Returns true if the given path exists on the local filesystem, | 134 // Returns true if the given path exists on the local filesystem, |
| 136 // false otherwise. | 135 // false otherwise. |
| 137 BASE_EXPORT bool PathExists(const base::FilePath& path); | 136 BASE_EXPORT bool PathExists(const base::FilePath& path); |
| 138 | 137 |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 if (x && *x >= 0) { | 420 if (x && *x >= 0) { |
| 422 if (HANDLE_EINTR(close(*x)) < 0) | 421 if (HANDLE_EINTR(close(*x)) < 0) |
| 423 DPLOG(ERROR) << "close"; | 422 DPLOG(ERROR) << "close"; |
| 424 } | 423 } |
| 425 } | 424 } |
| 426 }; | 425 }; |
| 427 | 426 |
| 428 typedef scoped_ptr_malloc<int, ScopedFDClose> ScopedFD; | 427 typedef scoped_ptr_malloc<int, ScopedFDClose> ScopedFD; |
| 429 #endif // OS_POSIX | 428 #endif // OS_POSIX |
| 430 | 429 |
| 431 // A class for enumerating the files in a provided path. The order of the | |
| 432 // results is not guaranteed. | |
| 433 // | |
| 434 // DO NOT USE FROM THE MAIN THREAD of your application unless it is a test | |
| 435 // program where latency does not matter. This class is blocking. | |
| 436 class BASE_EXPORT FileEnumerator { | |
| 437 public: | |
| 438 #if defined(OS_WIN) | |
| 439 typedef WIN32_FIND_DATA FindInfo; | |
| 440 #elif defined(OS_POSIX) | |
| 441 typedef struct { | |
| 442 struct stat stat; | |
| 443 std::string filename; | |
| 444 } FindInfo; | |
| 445 #endif | |
| 446 | |
| 447 enum FileType { | |
| 448 FILES = 1 << 0, | |
| 449 DIRECTORIES = 1 << 1, | |
| 450 INCLUDE_DOT_DOT = 1 << 2, | |
| 451 #if defined(OS_POSIX) | |
| 452 SHOW_SYM_LINKS = 1 << 4, | |
| 453 #endif | |
| 454 }; | |
| 455 | |
| 456 // |root_path| is the starting directory to search for. It may or may not end | |
| 457 // in a slash. | |
| 458 // | |
| 459 // If |recursive| is true, this will enumerate all matches in any | |
| 460 // subdirectories matched as well. It does a breadth-first search, so all | |
| 461 // files in one directory will be returned before any files in a | |
| 462 // subdirectory. | |
| 463 // | |
| 464 // |file_type|, a bit mask of FileType, specifies whether the enumerator | |
| 465 // should match files, directories, or both. | |
| 466 // | |
| 467 // |pattern| is an optional pattern for which files to match. This | |
| 468 // works like shell globbing. For example, "*.txt" or "Foo???.doc". | |
| 469 // However, be careful in specifying patterns that aren't cross platform | |
| 470 // since the underlying code uses OS-specific matching routines. In general, | |
| 471 // Windows matching is less featureful than others, so test there first. | |
| 472 // If unspecified, this will match all files. | |
| 473 // NOTE: the pattern only matches the contents of root_path, not files in | |
| 474 // recursive subdirectories. | |
| 475 // TODO(erikkay): Fix the pattern matching to work at all levels. | |
| 476 FileEnumerator(const base::FilePath& root_path, | |
| 477 bool recursive, | |
| 478 int file_type); | |
| 479 FileEnumerator(const base::FilePath& root_path, | |
| 480 bool recursive, | |
| 481 int file_type, | |
| 482 const base::FilePath::StringType& pattern); | |
| 483 ~FileEnumerator(); | |
| 484 | |
| 485 // Returns an empty string if there are no more results. | |
| 486 base::FilePath Next(); | |
| 487 | |
| 488 // Write the file info into |info|. | |
| 489 void GetFindInfo(FindInfo* info); | |
| 490 | |
| 491 // Looks inside a FindInfo and determines if it's a directory. | |
| 492 static bool IsDirectory(const FindInfo& info); | |
| 493 | |
| 494 static base::FilePath GetFilename(const FindInfo& find_info); | |
| 495 static int64 GetFilesize(const FindInfo& find_info); | |
| 496 static base::Time GetLastModifiedTime(const FindInfo& find_info); | |
| 497 | |
| 498 private: | |
| 499 // Returns true if the given path should be skipped in enumeration. | |
| 500 bool ShouldSkip(const base::FilePath& path); | |
| 501 | |
| 502 | |
| 503 #if defined(OS_WIN) | |
| 504 // True when find_data_ is valid. | |
| 505 bool has_find_data_; | |
| 506 WIN32_FIND_DATA find_data_; | |
| 507 HANDLE find_handle_; | |
| 508 #elif defined(OS_POSIX) | |
| 509 struct DirectoryEntryInfo { | |
| 510 base::FilePath filename; | |
| 511 struct stat stat; | |
| 512 }; | |
| 513 | |
| 514 // Read the filenames in source into the vector of DirectoryEntryInfo's | |
| 515 static bool ReadDirectory(std::vector<DirectoryEntryInfo>* entries, | |
| 516 const base::FilePath& source, bool show_links); | |
| 517 | |
| 518 // The files in the current directory | |
| 519 std::vector<DirectoryEntryInfo> directory_entries_; | |
| 520 | |
| 521 // The next entry to use from the directory_entries_ vector | |
| 522 size_t current_directory_entry_; | |
| 523 #endif | |
| 524 | |
| 525 base::FilePath root_path_; | |
| 526 bool recursive_; | |
| 527 int file_type_; | |
| 528 base::FilePath::StringType pattern_; // Empty when we want to find | |
| 529 // everything. | |
| 530 | |
| 531 // A stack that keeps track of which subdirectories we still need to | |
| 532 // enumerate in the breadth-first search. | |
| 533 std::stack<base::FilePath> pending_paths_; | |
| 534 | |
| 535 DISALLOW_COPY_AND_ASSIGN(FileEnumerator); | |
| 536 }; | |
| 537 | |
| 538 #if defined(OS_LINUX) | 430 #if defined(OS_LINUX) |
| 539 // Broad categories of file systems as returned by statfs() on Linux. | 431 // Broad categories of file systems as returned by statfs() on Linux. |
| 540 enum FileSystemType { | 432 enum FileSystemType { |
| 541 FILE_SYSTEM_UNKNOWN, // statfs failed. | 433 FILE_SYSTEM_UNKNOWN, // statfs failed. |
| 542 FILE_SYSTEM_0, // statfs.f_type == 0 means unknown, may indicate AFS. | 434 FILE_SYSTEM_0, // statfs.f_type == 0 means unknown, may indicate AFS. |
| 543 FILE_SYSTEM_ORDINARY, // on-disk filesystem like ext2 | 435 FILE_SYSTEM_ORDINARY, // on-disk filesystem like ext2 |
| 544 FILE_SYSTEM_NFS, | 436 FILE_SYSTEM_NFS, |
| 545 FILE_SYSTEM_SMB, | 437 FILE_SYSTEM_SMB, |
| 546 FILE_SYSTEM_CODA, | 438 FILE_SYSTEM_CODA, |
| 547 FILE_SYSTEM_MEMORY, // in-memory file system | 439 FILE_SYSTEM_MEMORY, // in-memory file system |
| 548 FILE_SYSTEM_CGROUP, // cgroup control. | 440 FILE_SYSTEM_CGROUP, // cgroup control. |
| 549 FILE_SYSTEM_OTHER, // any other value. | 441 FILE_SYSTEM_OTHER, // any other value. |
| 550 FILE_SYSTEM_TYPE_COUNT | 442 FILE_SYSTEM_TYPE_COUNT |
| 551 }; | 443 }; |
| 552 | 444 |
| 553 // Attempts determine the FileSystemType for |path|. | 445 // Attempts determine the FileSystemType for |path|. |
| 554 // Returns false if |path| doesn't exist. | 446 // Returns false if |path| doesn't exist. |
| 555 BASE_EXPORT bool GetFileSystemType(const base::FilePath& path, | 447 BASE_EXPORT bool GetFileSystemType(const base::FilePath& path, |
| 556 FileSystemType* type); | 448 FileSystemType* type); |
| 557 #endif | 449 #endif |
| 558 | 450 |
| 559 } // namespace file_util | 451 } // namespace file_util |
| 560 | 452 |
| 561 #endif // BASE_FILE_UTIL_H_ | 453 #endif // BASE_FILE_UTIL_H_ |
| OLD | NEW |