diff options
Diffstat (limited to 'base')
-rw-r--r-- | base/platform_file.h | 2 | ||||
-rw-r--r-- | base/platform_file_unittest.cc | 36 | ||||
-rw-r--r-- | base/platform_file_win.cc | 2 |
3 files changed, 40 insertions, 0 deletions
diff --git a/base/platform_file.h b/base/platform_file.h index 5b29e07..afe909a 100644 --- a/base/platform_file.h +++ b/base/platform_file.h @@ -50,6 +50,8 @@ enum PlatformFileFlags { PLATFORM_FILE_WRITE_ATTRIBUTES = 8192, // Used on Windows only PLATFORM_FILE_ENUMERATE = 16384, // May enumerate directory + + PLATFORM_FILE_SHARE_DELETE = 32768, // Used on Windows only }; // PLATFORM_FILE_ERROR_ACCESS_DENIED is returned when a call fails because of diff --git a/base/platform_file_unittest.cc b/base/platform_file_unittest.cc index 0bd4fb3..039c7ef 100644 --- a/base/platform_file_unittest.cc +++ b/base/platform_file_unittest.cc @@ -127,6 +127,42 @@ TEST(PlatformFile, CreatePlatformFile) { EXPECT_FALSE(file_util::PathExists(file_path)); } +TEST(PlatformFile, DeleteOpenFile) { + ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + FilePath file_path = temp_dir.path().AppendASCII("create_file_1"); + + // Create a file. + bool created = false; + base::PlatformFileError error_code = base::PLATFORM_FILE_OK; + base::PlatformFile file = base::CreatePlatformFile( + file_path, + base::PLATFORM_FILE_OPEN_ALWAYS | + base::PLATFORM_FILE_READ | + base::PLATFORM_FILE_SHARE_DELETE, + &created, &error_code); + EXPECT_NE(base::kInvalidPlatformFileValue, file); + EXPECT_TRUE(created); + EXPECT_EQ(base::PLATFORM_FILE_OK, error_code); + + // Open an existing file and mark it as delete on close. + created = false; + base::PlatformFile same_file = base::CreatePlatformFile( + file_path, + base::PLATFORM_FILE_OPEN | + base::PLATFORM_FILE_DELETE_ON_CLOSE | + base::PLATFORM_FILE_READ, + &created, &error_code); + EXPECT_NE(base::kInvalidPlatformFileValue, file); + EXPECT_FALSE(created); + EXPECT_EQ(base::PLATFORM_FILE_OK, error_code); + + // Close both handles and check that the file is gone. + base::ClosePlatformFile(file); + base::ClosePlatformFile(same_file); + EXPECT_FALSE(file_util::PathExists(file_path)); +} + TEST(PlatformFile, ReadWritePlatformFile) { ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); diff --git a/base/platform_file_win.cc b/base/platform_file_win.cc index f448db0..8374042 100644 --- a/base/platform_file_win.cc +++ b/base/platform_file_win.cc @@ -58,6 +58,8 @@ PlatformFile CreatePlatformFile(const FilePath& name, DWORD sharing = (flags & PLATFORM_FILE_EXCLUSIVE_READ) ? 0 : FILE_SHARE_READ; if (!(flags & PLATFORM_FILE_EXCLUSIVE_WRITE)) sharing |= FILE_SHARE_WRITE; + if (flags & PLATFORM_FILE_SHARE_DELETE) + sharing |= FILE_SHARE_DELETE; DWORD create_flags = 0; if (flags & PLATFORM_FILE_ASYNC) |