OLD | NEW |
---|---|
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
220 | 220 |
221 bool success = true; | 221 bool success = true; |
222 FileEnumerator::FILE_TYPE traverse_type = | 222 FileEnumerator::FILE_TYPE traverse_type = |
223 static_cast<FileEnumerator::FILE_TYPE>(FileEnumerator::FILES | | 223 static_cast<FileEnumerator::FILE_TYPE>(FileEnumerator::FILES | |
224 FileEnumerator::SHOW_SYM_LINKS); | 224 FileEnumerator::SHOW_SYM_LINKS); |
225 if (recursive) | 225 if (recursive) |
226 traverse_type = static_cast<FileEnumerator::FILE_TYPE>( | 226 traverse_type = static_cast<FileEnumerator::FILE_TYPE>( |
227 traverse_type | FileEnumerator::DIRECTORIES); | 227 traverse_type | FileEnumerator::DIRECTORIES); |
228 FileEnumerator traversal(from_path, recursive, traverse_type); | 228 FileEnumerator traversal(from_path, recursive, traverse_type); |
229 | 229 |
230 // to_path may not exist yet, start the loop with to_path | 230 // We have to mimic windows behavoir here. |to_path| may not exist yet, |
sgk
2009/10/13 17:49:13
Nit: "behavior"
| |
231 // start the loop with |to_path|. If this is a recrursive copy and | |
sgk
2009/10/13 17:49:13
Nit: "recursive"
| |
232 // the destination already exists, we have to copy the source directory | |
233 // as well. | |
231 FileEnumerator::FindInfo info; | 234 FileEnumerator::FindInfo info; |
232 FilePath current = from_path; | 235 FilePath current = from_path; |
236 FilePath from_path_base = from_path; | |
237 if (recursive && stat(to_path.value().c_str(), &info.stat) == 0) { | |
238 // If the destination already exists, then the top level of source | |
239 // needs to be copied. | |
240 from_path_base = from_path.DirName(); | |
241 } | |
233 if (stat(from_path.value().c_str(), &info.stat) < 0) { | 242 if (stat(from_path.value().c_str(), &info.stat) < 0) { |
234 LOG(ERROR) << "CopyDirectory() couldn't stat source directory: " << | 243 LOG(ERROR) << "CopyDirectory() couldn't stat source directory: " << |
235 from_path.value() << " errno = " << errno; | 244 from_path.value() << " errno = " << errno; |
236 success = false; | 245 success = false; |
237 } | 246 } |
238 | 247 |
239 while (success && !current.empty()) { | 248 while (success && !current.empty()) { |
240 // current is the source path, including from_path, so paste | 249 // current is the source path, including from_path, so paste |
241 // the suffix after from_path onto to_path to create the target_path. | 250 // the suffix after from_path onto to_path to create the target_path. |
242 std::string suffix(¤t.value().c_str()[from_path.value().size()]); | 251 std::string suffix(¤t.value().c_str()[from_path_base.value().size()]); |
243 // Strip the leading '/' (if any). | 252 // Strip the leading '/' (if any). |
244 if (!suffix.empty()) { | 253 if (!suffix.empty()) { |
245 DCHECK_EQ('/', suffix[0]); | 254 DCHECK_EQ('/', suffix[0]); |
246 suffix.erase(0, 1); | 255 suffix.erase(0, 1); |
247 } | 256 } |
248 const FilePath target_path = to_path.Append(suffix); | 257 const FilePath target_path = to_path.Append(suffix); |
249 | 258 |
250 if (S_ISDIR(info.stat.st_mode)) { | 259 if (S_ISDIR(info.stat.st_mode)) { |
251 if (mkdir(target_path.value().c_str(), info.stat.st_mode & 01777) != 0 && | 260 if (mkdir(target_path.value().c_str(), info.stat.st_mode & 01777) != 0 && |
252 errno != EEXIST) { | 261 errno != EEXIST) { |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
675 munmap(data_, length_); | 684 munmap(data_, length_); |
676 if (file_ != -1) | 685 if (file_ != -1) |
677 close(file_); | 686 close(file_); |
678 | 687 |
679 data_ = NULL; | 688 data_ = NULL; |
680 length_ = 0; | 689 length_ = 0; |
681 file_ = -1; | 690 file_ = -1; |
682 } | 691 } |
683 | 692 |
684 } // namespace file_util | 693 } // namespace file_util |
OLD | NEW |