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 <vector> | 5 #include <vector> |
6 #include <windows.h> | 6 #include <windows.h> |
7 | 7 |
8 #include "chrome/test/test_file_util.h" | 8 #include "chrome/test/test_file_util.h" |
9 | 9 |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
11 #include "chrome/common/win_util.h" | 11 #include "chrome/common/win_util.h" |
12 | 12 |
13 namespace file_util { | 13 namespace file_util { |
14 | 14 |
| 15 bool EvictFileFromSystemCache(const wchar_t* file) { |
| 16 // Request exclusive access to the file and overwrite it with no buffering. |
| 17 win_util::ScopedHandle hfile( |
| 18 CreateFile(file, GENERIC_READ | GENERIC_WRITE, 0, NULL, |
| 19 OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, |
| 20 NULL)); |
| 21 if (!hfile) |
| 22 return false; |
| 23 |
| 24 // Execute in chunks. It could be optimized. We want to do few of these since |
| 25 // these opterations will be slow without the cache. |
| 26 char buffer[4096]; |
| 27 int total_bytes = 0; |
| 28 DWORD bytes_read; |
| 29 for (;;) { |
| 30 bytes_read = 0; |
| 31 ReadFile(hfile, buffer, sizeof(buffer), &bytes_read, NULL); |
| 32 if (bytes_read == 0) |
| 33 break; |
| 34 |
| 35 SetFilePointer(hfile, total_bytes, 0, FILE_BEGIN); |
| 36 if (!WriteFile(hfile, buffer, bytes_read, &bytes_read, NULL)) |
| 37 return false; |
| 38 total_bytes += bytes_read; |
| 39 } |
| 40 return true; |
| 41 } |
| 42 |
15 // Like CopyFileNoCache but recursively copies all files and subdirectories | 43 // Like CopyFileNoCache but recursively copies all files and subdirectories |
16 // in the given input directory to the output directory. | 44 // in the given input directory to the output directory. |
17 bool CopyRecursiveDirNoCache(const std::wstring& source_dir, | 45 bool CopyRecursiveDirNoCache(const std::wstring& source_dir, |
18 const std::wstring& dest_dir) { | 46 const std::wstring& dest_dir) { |
19 // Try to create the directory if it doesn't already exist. | 47 // Try to create the directory if it doesn't already exist. |
20 if (!CreateDirectory(dest_dir)) { | 48 if (!CreateDirectory(dest_dir)) { |
21 if (GetLastError() != ERROR_ALREADY_EXISTS) | 49 if (GetLastError() != ERROR_ALREADY_EXISTS) |
22 return false; | 50 return false; |
23 } | 51 } |
24 | 52 |
(...skipping 28 matching lines...) Expand all Loading... |
53 // Copy the file. | 81 // Copy the file. |
54 if (!::CopyFile(cur_source_path.c_str(), cur_dest_path.c_str(), false)) { | 82 if (!::CopyFile(cur_source_path.c_str(), cur_dest_path.c_str(), false)) { |
55 FindClose(fh); | 83 FindClose(fh); |
56 return false; | 84 return false; |
57 } | 85 } |
58 | 86 |
59 // We don't check for errors from this function, often, we are copying | 87 // We don't check for errors from this function, often, we are copying |
60 // files that are in the repository, and they will have read-only set. | 88 // files that are in the repository, and they will have read-only set. |
61 // This will prevent us from evicting from the cache, but these don't | 89 // This will prevent us from evicting from the cache, but these don't |
62 // matter anyway. | 90 // matter anyway. |
63 file_util::EvictFileFromSystemCache(cur_dest_path.c_str()); | 91 EvictFileFromSystemCache(cur_dest_path.c_str()); |
64 } | 92 } |
65 } while (FindNextFile(fh, &fd)); | 93 } while (FindNextFile(fh, &fd)); |
66 | 94 |
67 FindClose(fh); | 95 FindClose(fh); |
68 return true; | 96 return true; |
69 } | 97 } |
70 | 98 |
71 } // namespace file_util | 99 } // namespace file_util |
72 | 100 |
OLD | NEW |