| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/files/file_enumerator.h" | 5 #include "base/files/file_enumerator.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/threading/thread_restrictions.h" | 10 #include "base/threading/thread_restrictions.h" |
| 11 #include "base/win/windows_version.h" |
| 11 | 12 |
| 12 namespace base { | 13 namespace base { |
| 13 | 14 |
| 14 // FileEnumerator::FileInfo ---------------------------------------------------- | 15 // FileEnumerator::FileInfo ---------------------------------------------------- |
| 15 | 16 |
| 16 FileEnumerator::FileInfo::FileInfo() { | 17 FileEnumerator::FileInfo::FileInfo() { |
| 17 memset(&find_data_, 0, sizeof(find_data_)); | 18 memset(&find_data_, 0, sizeof(find_data_)); |
| 18 } | 19 } |
| 19 | 20 |
| 20 bool FileEnumerator::FileInfo::IsDirectory() const { | 21 bool FileEnumerator::FileInfo::IsDirectory() const { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 pending_paths_.pop(); | 93 pending_paths_.pop(); |
| 93 | 94 |
| 94 // Start a new find operation. | 95 // Start a new find operation. |
| 95 FilePath src = root_path_; | 96 FilePath src = root_path_; |
| 96 | 97 |
| 97 if (pattern_.empty()) | 98 if (pattern_.empty()) |
| 98 src = src.Append(L"*"); // No pattern = match everything. | 99 src = src.Append(L"*"); // No pattern = match everything. |
| 99 else | 100 else |
| 100 src = src.Append(pattern_); | 101 src = src.Append(pattern_); |
| 101 | 102 |
| 102 find_handle_ = FindFirstFile(src.value().c_str(), &find_data_); | 103 if (base::win::GetVersion() >= base::win::VERSION_WIN7) { |
| 104 // Use a "large fetch" on newer Windows which should speed up large |
| 105 // enumerations (we seldom abort in the middle). |
| 106 find_handle_ = FindFirstFileEx(src.value().c_str(), |
| 107 FindExInfoBasic, // Omit short name. |
| 108 &find_data_, |
| 109 FindExSearchNameMatch, |
| 110 NULL, |
| 111 FIND_FIRST_EX_LARGE_FETCH); |
| 112 } else { |
| 113 find_handle_ = FindFirstFile(src.value().c_str(), &find_data_); |
| 114 } |
| 103 has_find_data_ = true; | 115 has_find_data_ = true; |
| 104 } else { | 116 } else { |
| 105 // Search for the next file/directory. | 117 // Search for the next file/directory. |
| 106 if (!FindNextFile(find_handle_, &find_data_)) { | 118 if (!FindNextFile(find_handle_, &find_data_)) { |
| 107 FindClose(find_handle_); | 119 FindClose(find_handle_); |
| 108 find_handle_ = INVALID_HANDLE_VALUE; | 120 find_handle_ = INVALID_HANDLE_VALUE; |
| 109 } | 121 } |
| 110 } | 122 } |
| 111 | 123 |
| 112 if (INVALID_HANDLE_VALUE == find_handle_) { | 124 if (INVALID_HANDLE_VALUE == find_handle_) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 142 return cur_file; | 154 return cur_file; |
| 143 } else if (file_type_ & FileEnumerator::FILES) { | 155 } else if (file_type_ & FileEnumerator::FILES) { |
| 144 return cur_file; | 156 return cur_file; |
| 145 } | 157 } |
| 146 } | 158 } |
| 147 | 159 |
| 148 return FilePath(); | 160 return FilePath(); |
| 149 } | 161 } |
| 150 | 162 |
| 151 } // namespace base | 163 } // namespace base |
| OLD | NEW |