summaryrefslogtreecommitdiffstats
path: root/base/files
diff options
context:
space:
mode:
authordbeam@chromium.org <dbeam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 05:46:20 +0000
committerdbeam@chromium.org <dbeam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 05:46:20 +0000
commit9e66a9b94a40eeeeb52c47c83990b0766e1b7ceb (patch)
tree0818f910c522fb5bda00cab55412201251db32f7 /base/files
parentad5b14e00b36aab6e2b2d6aba8477a5dd9a11998 (diff)
downloadchromium_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.cc21
-rw-r--r--base/files/file_enumerator.h156
-rw-r--r--base/files/file_enumerator_posix.cc160
-rw-r--r--base/files/file_enumerator_win.cc149
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