OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <windows.h> | 7 #include <windows.h> |
8 #include <psapi.h> | 8 #include <psapi.h> |
9 #include <shellapi.h> | 9 #include <shellapi.h> |
10 #include <shlobj.h> | 10 #include <shlobj.h> |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 | 171 |
172 // The following code assumes that from path is a directory. | 172 // The following code assumes that from path is a directory. |
173 DCHECK(DirectoryExists(from_path)); | 173 DCHECK(DirectoryExists(from_path)); |
174 | 174 |
175 // Instead of creating a new directory, we copy the old one to include the | 175 // Instead of creating a new directory, we copy the old one to include the |
176 // security information of the folder as part of the copy. | 176 // security information of the folder as part of the copy. |
177 if (!PathExists(to_path)) { | 177 if (!PathExists(to_path)) { |
178 // Except that Vista fails to do that, and instead do a recursive copy if | 178 // Except that Vista fails to do that, and instead do a recursive copy if |
179 // the target directory doesn't exist. | 179 // the target directory doesn't exist. |
180 if (base::win::GetVersion() >= base::win::VERSION_VISTA) | 180 if (base::win::GetVersion() >= base::win::VERSION_VISTA) |
181 file_util::CreateDirectory(to_path); | 181 CreateDirectory(to_path); |
182 else | 182 else |
183 ShellCopy(from_path, to_path, false); | 183 ShellCopy(from_path, to_path, false); |
184 } | 184 } |
185 | 185 |
186 FilePath directory = from_path.Append(L"*.*"); | 186 FilePath directory = from_path.Append(L"*.*"); |
187 return ShellCopy(directory, to_path, false); | 187 return ShellCopy(directory, to_path, false); |
188 } | 188 } |
189 | 189 |
190 bool PathExists(const FilePath& path) { | 190 bool PathExists(const FilePath& path) { |
191 ThreadRestrictions::AssertIOAllowed(); | 191 ThreadRestrictions::AssertIOAllowed(); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 FilePath* new_temp_path) { | 322 FilePath* new_temp_path) { |
323 ThreadRestrictions::AssertIOAllowed(); | 323 ThreadRestrictions::AssertIOAllowed(); |
324 | 324 |
325 FilePath system_temp_dir; | 325 FilePath system_temp_dir; |
326 if (!GetTempDir(&system_temp_dir)) | 326 if (!GetTempDir(&system_temp_dir)) |
327 return false; | 327 return false; |
328 | 328 |
329 return CreateTemporaryDirInDir(system_temp_dir, prefix, new_temp_path); | 329 return CreateTemporaryDirInDir(system_temp_dir, prefix, new_temp_path); |
330 } | 330 } |
331 | 331 |
332 } // namespace base | |
333 | |
334 // ----------------------------------------------------------------------------- | |
335 | |
336 namespace file_util { | |
337 | |
338 using base::DirectoryExists; | |
339 using base::FilePath; | |
340 using base::kFileShareAll; | |
341 | |
342 bool CreateDirectoryAndGetError(const FilePath& full_path, | 332 bool CreateDirectoryAndGetError(const FilePath& full_path, |
343 base::PlatformFileError* error) { | 333 PlatformFileError* error) { |
344 base::ThreadRestrictions::AssertIOAllowed(); | 334 ThreadRestrictions::AssertIOAllowed(); |
345 | 335 |
346 // If the path exists, we've succeeded if it's a directory, failed otherwise. | 336 // If the path exists, we've succeeded if it's a directory, failed otherwise. |
347 const wchar_t* full_path_str = full_path.value().c_str(); | 337 const wchar_t* full_path_str = full_path.value().c_str(); |
348 DWORD fileattr = ::GetFileAttributes(full_path_str); | 338 DWORD fileattr = ::GetFileAttributes(full_path_str); |
349 if (fileattr != INVALID_FILE_ATTRIBUTES) { | 339 if (fileattr != INVALID_FILE_ATTRIBUTES) { |
350 if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0) { | 340 if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0) { |
351 DVLOG(1) << "CreateDirectory(" << full_path_str << "), " | 341 DVLOG(1) << "CreateDirectory(" << full_path_str << "), " |
352 << "directory already exists."; | 342 << "directory already exists."; |
353 return true; | 343 return true; |
354 } | 344 } |
355 DLOG(WARNING) << "CreateDirectory(" << full_path_str << "), " | 345 DLOG(WARNING) << "CreateDirectory(" << full_path_str << "), " |
356 << "conflicts with existing file."; | 346 << "conflicts with existing file."; |
357 if (error) { | 347 if (error) { |
358 *error = base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; | 348 *error = PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; |
359 } | 349 } |
360 return false; | 350 return false; |
361 } | 351 } |
362 | 352 |
363 // Invariant: Path does not exist as file or directory. | 353 // Invariant: Path does not exist as file or directory. |
364 | 354 |
365 // Attempt to create the parent recursively. This will immediately return | 355 // Attempt to create the parent recursively. This will immediately return |
366 // true if it already exists, otherwise will create all required parent | 356 // true if it already exists, otherwise will create all required parent |
367 // directories starting with the highest-level missing parent. | 357 // directories starting with the highest-level missing parent. |
368 FilePath parent_path(full_path.DirName()); | 358 FilePath parent_path(full_path.DirName()); |
369 if (parent_path.value() == full_path.value()) { | 359 if (parent_path.value() == full_path.value()) { |
370 if (error) { | 360 if (error) { |
371 *error = base::PLATFORM_FILE_ERROR_NOT_FOUND; | 361 *error = PLATFORM_FILE_ERROR_NOT_FOUND; |
372 } | 362 } |
373 return false; | 363 return false; |
374 } | 364 } |
375 if (!CreateDirectoryAndGetError(parent_path, error)) { | 365 if (!CreateDirectoryAndGetError(parent_path, error)) { |
376 DLOG(WARNING) << "Failed to create one of the parent directories."; | 366 DLOG(WARNING) << "Failed to create one of the parent directories."; |
377 if (error) { | 367 if (error) { |
378 DCHECK(*error != base::PLATFORM_FILE_OK); | 368 DCHECK(*error != PLATFORM_FILE_OK); |
379 } | 369 } |
380 return false; | 370 return false; |
381 } | 371 } |
382 | 372 |
383 if (!::CreateDirectory(full_path_str, NULL)) { | 373 if (!::CreateDirectory(full_path_str, NULL)) { |
384 DWORD error_code = ::GetLastError(); | 374 DWORD error_code = ::GetLastError(); |
385 if (error_code == ERROR_ALREADY_EXISTS && DirectoryExists(full_path)) { | 375 if (error_code == ERROR_ALREADY_EXISTS && DirectoryExists(full_path)) { |
386 // This error code ERROR_ALREADY_EXISTS doesn't indicate whether we | 376 // This error code ERROR_ALREADY_EXISTS doesn't indicate whether we |
387 // were racing with someone creating the same directory, or a file | 377 // were racing with someone creating the same directory, or a file |
388 // with the same path. If DirectoryExists() returns true, we lost the | 378 // with the same path. If DirectoryExists() returns true, we lost the |
389 // race to create the same directory. | 379 // race to create the same directory. |
390 return true; | 380 return true; |
391 } else { | 381 } else { |
392 if (error) | 382 if (error) |
393 *error = base::LastErrorToPlatformFileError(error_code); | 383 *error = LastErrorToPlatformFileError(error_code); |
394 DLOG(WARNING) << "Failed to create directory " << full_path_str | 384 DLOG(WARNING) << "Failed to create directory " << full_path_str |
395 << ", last error is " << error_code << "."; | 385 << ", last error is " << error_code << "."; |
396 return false; | 386 return false; |
397 } | 387 } |
398 } else { | 388 } else { |
399 return true; | 389 return true; |
400 } | 390 } |
401 } | 391 } |
402 | 392 |
| 393 } // namespace base |
| 394 |
| 395 // ----------------------------------------------------------------------------- |
| 396 |
| 397 namespace file_util { |
| 398 |
| 399 using base::DirectoryExists; |
| 400 using base::FilePath; |
| 401 using base::kFileShareAll; |
| 402 |
403 // TODO(rkc): Work out if we want to handle NTFS junctions here or not, handle | 403 // TODO(rkc): Work out if we want to handle NTFS junctions here or not, handle |
404 // them if we do decide to. | 404 // them if we do decide to. |
405 bool IsLink(const FilePath& file_path) { | 405 bool IsLink(const FilePath& file_path) { |
406 return false; | 406 return false; |
407 } | 407 } |
408 | 408 |
409 bool GetFileInfo(const FilePath& file_path, base::PlatformFileInfo* results) { | 409 bool GetFileInfo(const FilePath& file_path, base::PlatformFileInfo* results) { |
410 base::ThreadRestrictions::AssertIOAllowed(); | 410 base::ThreadRestrictions::AssertIOAllowed(); |
411 | 411 |
412 WIN32_FILE_ATTRIBUTE_DATA attr; | 412 WIN32_FILE_ATTRIBUTE_DATA attr; |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
744 // Like Move, this function is not transactional, so we just | 744 // Like Move, this function is not transactional, so we just |
745 // leave the copied bits behind if deleting from_path fails. | 745 // leave the copied bits behind if deleting from_path fails. |
746 // If to_path exists previously then we have already overwritten | 746 // If to_path exists previously then we have already overwritten |
747 // it by now, we don't get better off by deleting the new bits. | 747 // it by now, we don't get better off by deleting the new bits. |
748 } | 748 } |
749 return false; | 749 return false; |
750 } | 750 } |
751 | 751 |
752 } // namespace internal | 752 } // namespace internal |
753 } // namespace base | 753 } // namespace base |
OLD | NEW |