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

Unified Diff: base/file_util_posix.cc

Issue 13247008: base: Extract FileEnumerator out of file_util.h (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: file_enumerator_posix.cc should not compile on win Created 7 years, 9 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/file_util.cc ('k') | base/file_util_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/file_util_posix.cc
diff --git a/base/file_util_posix.cc b/base/file_util_posix.cc
index c7014b637718ce7333c4bebd3b63192fed4a5dea..eae5b1277a7745584babd8aa15dbb359917c115b 100644
--- a/base/file_util_posix.cc
+++ b/base/file_util_posix.cc
@@ -709,156 +709,6 @@ bool SetCurrentDirectory(const FilePath& path) {
return !ret;
}
-///////////////////////////////////////////////
-// 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<DirectoryEntryInfo> entries;
- if (!ReadDirectory(&entries, root_path_, file_type_ & SHOW_SYM_LINKS))
- continue;
-
- directory_entries_.clear();
- current_directory_entry_ = 0;
- for (std::vector<DirectoryEntryInfo>::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);
-}
-
-void FileEnumerator::GetFindInfo(FindInfo* info) {
- DCHECK(info);
-
- if (current_directory_entry_ >= directory_entries_.size())
- return;
-
- DirectoryEntryInfo* cur_entry = &directory_entries_[current_directory_entry_];
- memcpy(&(info->stat), &(cur_entry->stat), sizeof(info->stat));
- info->filename.assign(cur_entry->filename.value());
-}
-
-// static
-bool FileEnumerator::IsDirectory(const FindInfo& info) {
- return S_ISDIR(info.stat.st_mode);
-}
-
-// static
-FilePath FileEnumerator::GetFilename(const FindInfo& find_info) {
- return FilePath(find_info.filename);
-}
-
-// static
-int64 FileEnumerator::GetFilesize(const FindInfo& find_info) {
- return find_info.stat.st_size;
-}
-
-// static
-base::Time FileEnumerator::GetLastModifiedTime(const FindInfo& find_info) {
- return base::Time::FromTimeT(find_info.stat.st_mtime);
-}
-
-bool FileEnumerator::ReadDirectory(std::vector<DirectoryEntryInfo>* 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) {
- DirectoryEntryInfo 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;
-}
-
bool HasFileBeenModifiedSince(const FileEnumerator::FindInfo& find_info,
const base::Time& cutoff_time) {
return static_cast<time_t>(find_info.stat.st_mtime) >= cutoff_time.ToTimeT();
« no previous file with comments | « base/file_util.cc ('k') | base/file_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698