| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/file_util.h" | 5 #include "base/file_util.h" |
| 6 | 6 |
| 7 #include <dirent.h> | 7 #include <dirent.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <fcntl.h> | 9 #include <fcntl.h> |
| 10 #include <fnmatch.h> | 10 #include <fnmatch.h> |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 return ret; | 165 return ret; |
| 166 } | 166 } |
| 167 if (!S_ISDIR(file_info.st_mode)) | 167 if (!S_ISDIR(file_info.st_mode)) |
| 168 return (unlink(path_str) == 0); | 168 return (unlink(path_str) == 0); |
| 169 if (!recursive) | 169 if (!recursive) |
| 170 return (rmdir(path_str) == 0); | 170 return (rmdir(path_str) == 0); |
| 171 | 171 |
| 172 bool success = true; | 172 bool success = true; |
| 173 std::stack<std::string> directories; | 173 std::stack<std::string> directories; |
| 174 directories.push(path.value()); | 174 directories.push(path.value()); |
| 175 FileEnumerator traversal(path, true, static_cast<FileEnumerator::FILE_TYPE>( | 175 FileEnumerator traversal(path, true, static_cast<FileEnumerator::FileType>( |
| 176 FileEnumerator::FILES | FileEnumerator::DIRECTORIES | | 176 FileEnumerator::FILES | FileEnumerator::DIRECTORIES | |
| 177 FileEnumerator::SHOW_SYM_LINKS)); | 177 FileEnumerator::SHOW_SYM_LINKS)); |
| 178 for (FilePath current = traversal.Next(); success && !current.empty(); | 178 for (FilePath current = traversal.Next(); success && !current.empty(); |
| 179 current = traversal.Next()) { | 179 current = traversal.Next()) { |
| 180 FileEnumerator::FindInfo info; | 180 FileEnumerator::FindInfo info; |
| 181 traversal.GetFindInfo(&info); | 181 traversal.GetFindInfo(&info); |
| 182 | 182 |
| 183 if (S_ISDIR(info.stat.st_mode)) | 183 if (S_ISDIR(info.stat.st_mode)) |
| 184 directories.push(current.value()); | 184 directories.push(current.value()); |
| 185 else | 185 else |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 } | 253 } |
| 254 FilePath real_from_path = from_path; | 254 FilePath real_from_path = from_path; |
| 255 if (!AbsolutePath(&real_from_path)) | 255 if (!AbsolutePath(&real_from_path)) |
| 256 return false; | 256 return false; |
| 257 if (real_to_path.value().size() >= real_from_path.value().size() && | 257 if (real_to_path.value().size() >= real_from_path.value().size() && |
| 258 real_to_path.value().compare(0, real_from_path.value().size(), | 258 real_to_path.value().compare(0, real_from_path.value().size(), |
| 259 real_from_path.value()) == 0) | 259 real_from_path.value()) == 0) |
| 260 return false; | 260 return false; |
| 261 | 261 |
| 262 bool success = true; | 262 bool success = true; |
| 263 FileEnumerator::FILE_TYPE traverse_type = | 263 FileEnumerator::FileType traverse_type = |
| 264 static_cast<FileEnumerator::FILE_TYPE>(FileEnumerator::FILES | | 264 static_cast<FileEnumerator::FileType>(FileEnumerator::FILES | |
| 265 FileEnumerator::SHOW_SYM_LINKS); | 265 FileEnumerator::SHOW_SYM_LINKS); |
| 266 if (recursive) | 266 if (recursive) |
| 267 traverse_type = static_cast<FileEnumerator::FILE_TYPE>( | 267 traverse_type = static_cast<FileEnumerator::FileType>( |
| 268 traverse_type | FileEnumerator::DIRECTORIES); | 268 traverse_type | FileEnumerator::DIRECTORIES); |
| 269 FileEnumerator traversal(from_path, recursive, traverse_type); | 269 FileEnumerator traversal(from_path, recursive, traverse_type); |
| 270 | 270 |
| 271 // We have to mimic windows behavior here. |to_path| may not exist yet, | 271 // We have to mimic windows behavior here. |to_path| may not exist yet, |
| 272 // start the loop with |to_path|. | 272 // start the loop with |to_path|. |
| 273 FileEnumerator::FindInfo info; | 273 FileEnumerator::FindInfo info; |
| 274 FilePath current = from_path; | 274 FilePath current = from_path; |
| 275 if (stat(from_path.value().c_str(), &info.stat) < 0) { | 275 if (stat(from_path.value().c_str(), &info.stat) < 0) { |
| 276 LOG(ERROR) << "CopyDirectory() couldn't stat source directory: " << | 276 LOG(ERROR) << "CopyDirectory() couldn't stat source directory: " << |
| 277 from_path.value() << " errno = " << errno; | 277 from_path.value() << " errno = " << errno; |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 base::ThreadRestrictions::AssertIOAllowed(); | 635 base::ThreadRestrictions::AssertIOAllowed(); |
| 636 int ret = chdir(path.value().c_str()); | 636 int ret = chdir(path.value().c_str()); |
| 637 return !ret; | 637 return !ret; |
| 638 } | 638 } |
| 639 | 639 |
| 640 /////////////////////////////////////////////// | 640 /////////////////////////////////////////////// |
| 641 // FileEnumerator | 641 // FileEnumerator |
| 642 | 642 |
| 643 FileEnumerator::FileEnumerator(const FilePath& root_path, | 643 FileEnumerator::FileEnumerator(const FilePath& root_path, |
| 644 bool recursive, | 644 bool recursive, |
| 645 FileEnumerator::FILE_TYPE file_type) | 645 FileType file_type) |
| 646 : current_directory_entry_(0), | 646 : current_directory_entry_(0), |
| 647 root_path_(root_path), | 647 root_path_(root_path), |
| 648 recursive_(recursive), | 648 recursive_(recursive), |
| 649 file_type_(file_type) { | 649 file_type_(file_type) { |
| 650 // INCLUDE_DOT_DOT must not be specified if recursive. | 650 // INCLUDE_DOT_DOT must not be specified if recursive. |
| 651 DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); | 651 DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); |
| 652 pending_paths_.push(root_path); | 652 pending_paths_.push(root_path); |
| 653 } | 653 } |
| 654 | 654 |
| 655 FileEnumerator::FileEnumerator(const FilePath& root_path, | 655 FileEnumerator::FileEnumerator(const FilePath& root_path, |
| 656 bool recursive, | 656 bool recursive, |
| 657 FileEnumerator::FILE_TYPE file_type, | 657 FileType file_type, |
| 658 const FilePath::StringType& pattern) | 658 const FilePath::StringType& pattern) |
| 659 : current_directory_entry_(0), | 659 : current_directory_entry_(0), |
| 660 root_path_(root_path), | 660 root_path_(root_path), |
| 661 recursive_(recursive), | 661 recursive_(recursive), |
| 662 file_type_(file_type), | 662 file_type_(file_type), |
| 663 pattern_(root_path.Append(pattern).value()) { | 663 pattern_(root_path.Append(pattern).value()) { |
| 664 // INCLUDE_DOT_DOT must not be specified if recursive. | 664 // INCLUDE_DOT_DOT must not be specified if recursive. |
| 665 DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); | 665 DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); |
| 666 // The Windows version of this code appends the pattern to the root_path, | 666 // The Windows version of this code appends the pattern to the root_path, |
| 667 // potentially only matching against items in the top-most directory. | 667 // potentially only matching against items in the top-most directory. |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 934 if (HANDLE_EINTR(close(infile)) < 0) | 934 if (HANDLE_EINTR(close(infile)) < 0) |
| 935 result = false; | 935 result = false; |
| 936 if (HANDLE_EINTR(close(outfile)) < 0) | 936 if (HANDLE_EINTR(close(outfile)) < 0) |
| 937 result = false; | 937 result = false; |
| 938 | 938 |
| 939 return result; | 939 return result; |
| 940 } | 940 } |
| 941 #endif // defined(OS_MACOSX) | 941 #endif // defined(OS_MACOSX) |
| 942 | 942 |
| 943 } // namespace file_util | 943 } // namespace file_util |
| OLD | NEW |