Chromium Code Reviews| Index: base/files/file_util_win.cc |
| diff --git a/base/files/file_util_win.cc b/base/files/file_util_win.cc |
| index 65dc5ce1e2fe7495624cc6d8c16b954395eb11ac..0e7b748aa61c731cabde41cf26247bfdc4fe91b8 100644 |
| --- a/base/files/file_util_win.cc |
| +++ b/base/files/file_util_win.cc |
| @@ -40,6 +40,31 @@ namespace { |
| const DWORD kFileShareAll = |
| FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; |
| +// An array consists of digits and alphabet. It is used to generate random |
| +// prefix of a temp file name which is passed to GetTempFileName Windows API. |
| +constexpr base::FilePath::CharType kAlphaNumberCharSet[] = |
|
grt (UTC plus 2)
2017/04/04 12:00:43
nit: move these constants into the function as sta
chengx
2017/04/05 05:39:51
This constant has been removed in the new patch se
|
| + FILE_PATH_LITERAL("0123456789abcdefghijklmnopqrstuvwxyz"); |
| + |
| +// The length of the temp file name prefix, which is used by GetTempFileName |
| +// Windows API. |
| +// GetTempFileName uses up to the first three characters of the input prefix |
| +// string as the prefix of the file name. Therefore, this constant is set to 3. |
| +// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364991(v=vs.85).aspx |
| +constexpr int kPrefixLength = 3; |
| + |
| +// Get a random prefix with length kPrefixLength of the temp file name. |
| +// The characters are obtained from kAlphaNumberCharSet. |
| +FilePath::StringType GetRandomPrefix() { |
| + FilePath::StringType temp_file_name_prefix(kPrefixLength, 0); |
| + |
| + for (size_t i = 0; i < kPrefixLength; i++) { |
|
grt (UTC plus 2)
2017/04/04 12:00:43
nit: prefer pre-increment; see style guide.
chengx
2017/04/05 05:39:51
This for-loop has been removed in the new patch se
|
| + temp_file_name_prefix[i] = kAlphaNumberCharSet[base::RandGenerator( |
| + arraysize(kAlphaNumberCharSet) - 1)]; |
| + } |
| + |
| + return temp_file_name_prefix; |
| +} |
| + |
| // Deletes all files and directories in a path. |
| // Returns false on the first failure it encounters. |
| bool DeleteFileRecursive(const FilePath& path, |
| @@ -342,7 +367,10 @@ bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { |
| wchar_t temp_name[MAX_PATH + 1]; |
| - if (!GetTempFileName(dir.value().c_str(), L"", 0, temp_name)) { |
| + // Supplying a random prefix to GetTempFileName can significantly boost the |
| + // chance of successfully creating a new unique name with one shot. |
| + if (!GetTempFileName(dir.value().c_str(), GetRandomPrefix().c_str(), 0, |
| + temp_name)) { |
| DPLOG(WARNING) << "Failed to get temporary file name in " |
| << UTF16ToUTF8(dir.value()); |
| return false; |