diff options
author | dbeam@chromium.org <dbeam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-08 05:46:20 +0000 |
---|---|---|
committer | dbeam@chromium.org <dbeam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-08 05:46:20 +0000 |
commit | 9e66a9b94a40eeeeb52c47c83990b0766e1b7ceb (patch) | |
tree | 0818f910c522fb5bda00cab55412201251db32f7 /base/files | |
parent | ad5b14e00b36aab6e2b2d6aba8477a5dd9a11998 (diff) | |
download | chromium_src-9e66a9b94a40eeeeb52c47c83990b0766e1b7ceb.zip chromium_src-9e66a9b94a40eeeeb52c47c83990b0766e1b7ceb.tar.gz chromium_src-9e66a9b94a40eeeeb52c47c83990b0766e1b7ceb.tar.bz2 |
Revert 198820 "Move FileEnumerator to its own file, do some refa..."
Broke both windows clobber and official builders' compile with this error:
771>Link:
771> Creating library ..\..\..\build\Release\lib\gcp_portmon64.lib and
object ..\..\..\build\Release\lib\gcp_portmon64.exp
771>base.lib(path_service.obj) : fatalerror LNK1112: module machine type 'X86'
conflicts with target machine type 'x64'
771>
771>Build FAILED.
> Move FileEnumerator to its own file, do some refactoring.
>
> It creates a class FileInfo to contain the details rather than using a platform-specific typedef. This allows the accessors GetName, GetSize, etc. to be moved directly to this class (previously they were static helpers on the FileEnumerator class) which makes a bunch of code much cleaner. It also gives reasonable getting and initialization which the previous version lacked.
>
> BUG=175002
> R=rvargas@chromium.org
>
> Review URL: https://codereview.chromium.org/13165005
TBR=brettw@chromium.org
Review URL: https://codereview.chromium.org/14824006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198850 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/files')
-rw-r--r-- | base/files/file_enumerator.cc | 21 | ||||
-rw-r--r-- | base/files/file_enumerator.h | 156 | ||||
-rw-r--r-- | base/files/file_enumerator_posix.cc | 160 | ||||
-rw-r--r-- | base/files/file_enumerator_win.cc | 149 |
4 files changed, 0 insertions, 486 deletions
diff --git a/base/files/file_enumerator.cc b/base/files/file_enumerator.cc deleted file mode 100644 index e49f465..0000000 --- a/base/files/file_enumerator.cc +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/files/file_enumerator.h" - -#include "base/file_util.h" - -namespace base { - -FileEnumerator::FileInfo::~FileInfo() { -} - -bool FileEnumerator::ShouldSkip(const FilePath& path) { - FilePath::StringType basename = path.BaseName().value(); - return basename == FILE_PATH_LITERAL(".") || - (basename == FILE_PATH_LITERAL("..") && - !(INCLUDE_DOT_DOT & file_type_)); -} - -} // namespace base diff --git a/base/files/file_enumerator.h b/base/files/file_enumerator.h deleted file mode 100644 index 3834281..0000000 --- a/base/files/file_enumerator.h +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_FILES_FILE_ENUMERATOR_H_ -#define BASE_FILES_FILE_ENUMERATOR_H_ - -#include <stack> -#include <vector> - -#include "base/base_export.h" -#include "base/basictypes.h" -#include "base/files/file_path.h" -#include "base/time.h" -#include "build/build_config.h" - -#if defined(OS_WIN) -#include <windows.h> -#elif defined(OS_POSIX) -#include <sys/stat.h> -#include <unistd.h> -#endif - -namespace base { - -// A class for enumerating the files in a provided path. The order of the -// results is not guaranteed. -// -// This is blocking. Do not use on critical threads. -// -// Example: -// -// base::FileEnumerator enum(my_dir, false, base::FileEnumerator::FILES, -// FILE_PATH_LITERAL("*.txt")); -// for (base::FilePath name = enum.Next(); !name.empty(); name = enum.Next()) -// ... -class BASE_EXPORT FileEnumerator { - public: - // Note: copy & assign supported. - class FileInfo { - public: - FileInfo(); - ~FileInfo(); - - bool IsDirectory() const; - - // The name of the file. This will not include any path information. This - // is in constrast to the value returned by FileEnumerator.Next() which - // includes the |root_path| passed into the FileEnumerator constructor. - FilePath GetName() const; - - int64 GetSize() const; - Time GetLastModifiedTime() const; - -#if defined(OS_WIN) - const WIN32_FIND_DATA& find_data() const { return find_data_; } -#elif defined(OS_POSIX) - const struct stat& stat() const { return stat_; } -#endif - - private: - friend class FileEnumerator; - -#if defined(OS_WIN) - WIN32_FIND_DATA find_data_; -#elif defined(OS_POSIX) - struct stat stat_; - FilePath filename_; -#endif - }; - - enum FileType { - FILES = 1 << 0, - DIRECTORIES = 1 << 1, - INCLUDE_DOT_DOT = 1 << 2, -#if defined(OS_POSIX) - SHOW_SYM_LINKS = 1 << 4, -#endif - }; - - // |root_path| is the starting directory to search for. It may or may not end - // in a slash. - // - // If |recursive| is true, this will enumerate all matches in any - // subdirectories matched as well. It does a breadth-first search, so all - // files in one directory will be returned before any files in a - // subdirectory. - // - // |file_type|, a bit mask of FileType, specifies whether the enumerator - // should match files, directories, or both. - // - // |pattern| is an optional pattern for which files to match. This - // works like shell globbing. For example, "*.txt" or "Foo???.doc". - // However, be careful in specifying patterns that aren't cross platform - // since the underlying code uses OS-specific matching routines. In general, - // Windows matching is less featureful than others, so test there first. - // If unspecified, this will match all files. - // NOTE: the pattern only matches the contents of root_path, not files in - // recursive subdirectories. - // TODO(erikkay): Fix the pattern matching to work at all levels. - FileEnumerator(const FilePath& root_path, - bool recursive, - int file_type); - FileEnumerator(const FilePath& root_path, - bool recursive, - int file_type, - const FilePath::StringType& pattern); - ~FileEnumerator(); - - // Returns the next file or an empty string if there are no more results. - // - // The returned path will incorporate the |root_path| passed in the - // constructor: "<root_path>/file_name.txt". If the |root_path| is absolute, - // then so will be the result of Next(). - FilePath Next(); - - // Write the file info into |info|. - FileInfo GetInfo() const; - - private: - // Returns true if the given path should be skipped in enumeration. - bool ShouldSkip(const FilePath& path); - -#if defined(OS_WIN) - // True when find_data_ is valid. - bool has_find_data_; - WIN32_FIND_DATA find_data_; - HANDLE find_handle_; -#elif defined(OS_POSIX) - - // Read the filenames in source into the vector of DirectoryEntryInfo's - static bool ReadDirectory(std::vector<FileInfo>* entries, - const FilePath& source, bool show_links); - - // The files in the current directory - std::vector<FileInfo> directory_entries_; - - // The next entry to use from the directory_entries_ vector - size_t current_directory_entry_; -#endif - - FilePath root_path_; - bool recursive_; - int file_type_; - FilePath::StringType pattern_; // Empty when we want to find everything. - - // A stack that keeps track of which subdirectories we still need to - // enumerate in the breadth-first search. - std::stack<FilePath> pending_paths_; - - DISALLOW_COPY_AND_ASSIGN(FileEnumerator); -}; - -} // namespace base - -#endif // BASE_FILES_FILE_ENUMERATOR_H_ diff --git a/base/files/file_enumerator_posix.cc b/base/files/file_enumerator_posix.cc deleted file mode 100644 index 7533a24..0000000 --- a/base/files/file_enumerator_posix.cc +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/files/file_enumerator.h" - -#include <dirent.h> -#include <errno.h> -#include <fnmatch.h> - -#include "base/logging.h" -#include "base/threading/thread_restrictions.h" - -namespace base { - -// FileEnumerator::FileInfo ---------------------------------------------------- - -FileEnumerator::FileInfo::FileInfo() { - memset(&stat_, 0, sizeof(stat_)); -} - -bool FileEnumerator::FileInfo::IsDirectory() const { - return S_ISDIR(stat_.st_mode); -} - -FilePath FileEnumerator::FileInfo::GetName() const { - return filename_; -} - -int64 FileEnumerator::FileInfo::GetSize() const { - return stat_.st_size; -} - -base::Time FileEnumerator::FileInfo::GetLastModifiedTime() const { - return base::Time::FromTimeT(stat_.st_mtime); -} - -// FileEnumerator -------------------------------------------------------------- - -FileEnumerator::FileEnumerator(const FilePath& root_path, - bool recursive, - int file_type) - : current_directory_entry_(0), - root_path_(root_path), - recursive_(recursive), - file_type_(file_type) { - // INCLUDE_DOT_DOT must not be specified if recursive. - DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); - pending_paths_.push(root_path); -} - -FileEnumerator::FileEnumerator(const FilePath& root_path, - bool recursive, - int file_type, - const FilePath::StringType& pattern) - : current_directory_entry_(0), - root_path_(root_path), - recursive_(recursive), - file_type_(file_type), - pattern_(root_path.Append(pattern).value()) { - // INCLUDE_DOT_DOT must not be specified if recursive. - DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); - // The Windows version of this code appends the pattern to the root_path, - // potentially only matching against items in the top-most directory. - // Do the same here. - if (pattern.empty()) - pattern_ = FilePath::StringType(); - pending_paths_.push(root_path); -} - -FileEnumerator::~FileEnumerator() { -} - -FilePath FileEnumerator::Next() { - ++current_directory_entry_; - - // While we've exhausted the entries in the current directory, do the next - while (current_directory_entry_ >= directory_entries_.size()) { - if (pending_paths_.empty()) - return FilePath(); - - root_path_ = pending_paths_.top(); - root_path_ = root_path_.StripTrailingSeparators(); - pending_paths_.pop(); - - std::vector<FileInfo> entries; - if (!ReadDirectory(&entries, root_path_, file_type_ & SHOW_SYM_LINKS)) - continue; - - directory_entries_.clear(); - current_directory_entry_ = 0; - for (std::vector<FileInfo>::const_iterator i = entries.begin(); - i != entries.end(); ++i) { - FilePath full_path = root_path_.Append(i->filename_); - if (ShouldSkip(full_path)) - continue; - - if (pattern_.size() && - fnmatch(pattern_.c_str(), full_path.value().c_str(), FNM_NOESCAPE)) - continue; - - if (recursive_ && S_ISDIR(i->stat_.st_mode)) - pending_paths_.push(full_path); - - if ((S_ISDIR(i->stat_.st_mode) && (file_type_ & DIRECTORIES)) || - (!S_ISDIR(i->stat_.st_mode) && (file_type_ & FILES))) - directory_entries_.push_back(*i); - } - } - - return root_path_.Append( - directory_entries_[current_directory_entry_].filename_); -} - -FileEnumerator::FileInfo FileEnumerator::GetInfo() const { - return directory_entries_[current_directory_entry_]; -} - -bool FileEnumerator::ReadDirectory(std::vector<FileInfo>* entries, - const FilePath& source, bool show_links) { - base::ThreadRestrictions::AssertIOAllowed(); - DIR* dir = opendir(source.value().c_str()); - if (!dir) - return false; - -#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_BSD) && \ - !defined(OS_SOLARIS) && !defined(OS_ANDROID) - #error Port warning: depending on the definition of struct dirent, \ - additional space for pathname may be needed -#endif - - struct dirent dent_buf; - struct dirent* dent; - while (readdir_r(dir, &dent_buf, &dent) == 0 && dent) { - FileInfo info; - info.filename_ = FilePath(dent->d_name); - - FilePath full_name = source.Append(dent->d_name); - int ret; - if (show_links) - ret = lstat(full_name.value().c_str(), &info.stat_); - else - ret = stat(full_name.value().c_str(), &info.stat_); - if (ret < 0) { - // Print the stat() error message unless it was ENOENT and we're - // following symlinks. - if (!(errno == ENOENT && !show_links)) { - DPLOG(ERROR) << "Couldn't stat " - << source.Append(dent->d_name).value(); - } - memset(&info.stat_, 0, sizeof(info.stat_)); - } - entries->push_back(info); - } - - closedir(dir); - return true; -} - -} // namespace base diff --git a/base/files/file_enumerator_win.cc b/base/files/file_enumerator_win.cc deleted file mode 100644 index 64c9845..0000000 --- a/base/files/file_enumerator_win.cc +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/files/file_enumerator.h" - -#include <string.h> - -#include "base/logging.h" -#include "base/threading/thread_restrictions.h" - -namespace base { - -// FileEnumerator::FileInfo ---------------------------------------------------- - -FileEnumerator::FileInfo::FileInfo() { - memset(&find_data_, 0, sizeof(find_data_)); -} - -bool FileEnumerator::FileInfo::IsDirectory() const { - return (find_data_.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; -} - -FilePath FileEnumerator::FileInfo::GetName() const { - return FilePath(find_data_.cFileName); -} - -int64 FileEnumerator::FileInfo::GetSize() const { - ULARGE_INTEGER size; - size.HighPart = find_data_.nFileSizeHigh; - size.LowPart = find_data_.nFileSizeLow; - DCHECK_LE(size.QuadPart, std::numeric_limits<int64>::max()); - return static_cast<int64>(size.QuadPart); -} - -base::Time FileEnumerator::FileInfo::GetLastModifiedTime() const { - return base::Time::FromFileTime(find_data_.ftLastWriteTime); -} - -// FileEnumerator -------------------------------------------------------------- - -FileEnumerator::FileEnumerator(const FilePath& root_path, - bool recursive, - int file_type) - : recursive_(recursive), - file_type_(file_type), - has_find_data_(false), - find_handle_(INVALID_HANDLE_VALUE) { - // INCLUDE_DOT_DOT must not be specified if recursive. - DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); - memset(&find_data_, 0, sizeof(find_data_)); - pending_paths_.push(root_path); -} - -FileEnumerator::FileEnumerator(const FilePath& root_path, - bool recursive, - int file_type, - const FilePath::StringType& pattern) - : recursive_(recursive), - file_type_(file_type), - has_find_data_(false), - pattern_(pattern), - find_handle_(INVALID_HANDLE_VALUE) { - // INCLUDE_DOT_DOT must not be specified if recursive. - DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); - memset(&find_data_, 0, sizeof(find_data_)); - pending_paths_.push(root_path); -} - -FileEnumerator::~FileEnumerator() { - if (find_handle_ != INVALID_HANDLE_VALUE) - FindClose(find_handle_); -} - -FileEnumerator::FileInfo FileEnumerator::GetInfo() const { - if (!has_find_data_) { - NOTREACHED(); - return FileInfo(); - } - FileInfo ret; - memcpy(&ret.find_data_, &find_data_, sizeof(find_data_)); - return ret; -} - -FilePath FileEnumerator::Next() { - base::ThreadRestrictions::AssertIOAllowed(); - - while (has_find_data_ || !pending_paths_.empty()) { - if (!has_find_data_) { - // The last find FindFirstFile operation is done, prepare a new one. - root_path_ = pending_paths_.top(); - pending_paths_.pop(); - - // Start a new find operation. - FilePath src = root_path_; - - if (pattern_.empty()) - src = src.Append(L"*"); // No pattern = match everything. - else - src = src.Append(pattern_); - - find_handle_ = FindFirstFile(src.value().c_str(), &find_data_); - has_find_data_ = true; - } else { - // Search for the next file/directory. - if (!FindNextFile(find_handle_, &find_data_)) { - FindClose(find_handle_); - find_handle_ = INVALID_HANDLE_VALUE; - } - } - - if (INVALID_HANDLE_VALUE == find_handle_) { - has_find_data_ = false; - - // This is reached when we have finished a directory and are advancing to - // the next one in the queue. We applied the pattern (if any) to the files - // in the root search directory, but for those directories which were - // matched, we want to enumerate all files inside them. This will happen - // when the handle is empty. - pattern_ = FilePath::StringType(); - - continue; - } - - FilePath cur_file(find_data_.cFileName); - if (ShouldSkip(cur_file)) - continue; - - // Construct the absolute filename. - cur_file = root_path_.Append(find_data_.cFileName); - - if (find_data_.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - if (recursive_) { - // If |cur_file| is a directory, and we are doing recursive searching, - // add it to pending_paths_ so we scan it after we finish scanning this - // directory. - pending_paths_.push(cur_file); - } - if (file_type_ & FileEnumerator::DIRECTORIES) - return cur_file; - } else if (file_type_ & FileEnumerator::FILES) { - return cur_file; - } - } - - return FilePath(); -} - -} // namespace base |