From 1d18ee82a95a68803e9f45ad8edb960b4482cdc6 Mon Sep 17 00:00:00 2001 From: Jeffrey Jangli Date: Fri, 13 Jul 2018 17:47:31 +0200 Subject: [PATCH] Fixes #479: File.Move on a file opened with FileShare.Delete succeeds but throws IOException. --- AlphaFS.UnitTest/AlphaFS.UnitTest.csproj | 1 + ....Move_FileOpenedWithFileShareDeleteFlag.cs | 68 +++++++++++++++++++ AlphaFS/Filesystem/File Class/File.GetSize.cs | 2 +- CHANGELOG.md | 8 +++ 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 AlphaFS.UnitTest/File Class/File.Move/AlphaFS_File.Move_FileOpenedWithFileShareDeleteFlag.cs diff --git a/AlphaFS.UnitTest/AlphaFS.UnitTest.csproj b/AlphaFS.UnitTest/AlphaFS.UnitTest.csproj index 355e412f9..6c2771b81 100644 --- a/AlphaFS.UnitTest/AlphaFS.UnitTest.csproj +++ b/AlphaFS.UnitTest/AlphaFS.UnitTest.csproj @@ -159,6 +159,7 @@ + diff --git a/AlphaFS.UnitTest/File Class/File.Move/AlphaFS_File.Move_FileOpenedWithFileShareDeleteFlag.cs b/AlphaFS.UnitTest/File Class/File.Move/AlphaFS_File.Move_FileOpenedWithFileShareDeleteFlag.cs new file mode 100644 index 000000000..b47dcd69f --- /dev/null +++ b/AlphaFS.UnitTest/File Class/File.Move/AlphaFS_File.Move_FileOpenedWithFileShareDeleteFlag.cs @@ -0,0 +1,68 @@ +/* Copyright (C) 2008-2018 Peter Palotas, Jeffrey Jangli, Alexandr Normuradov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; + +namespace AlphaFS.UnitTest +{ + public partial class MoveTest + { + // Pattern: ___ + + + [TestMethod] + public void AlphaFS_File_Move_FileOpenedWithFileShareDeleteFlag_LocalAndNetwork_Success() + { + AlphaFS_File_Move_FileOpenedWithFileShareDeleteFlag(false); + AlphaFS_File_Move_FileOpenedWithFileShareDeleteFlag(true); + } + + + private void AlphaFS_File_Move_FileOpenedWithFileShareDeleteFlag(bool isNetwork) + { + using (var tempRoot = new TemporaryDirectory(isNetwork)) + { + var folder = tempRoot.CreateDirectory(); + + var srcFile = System.IO.Path.Combine(folder.FullName, tempRoot.RandomString); + + var dstFile = System.IO.Path.Combine(folder.FullName, tempRoot.RandomString); + + Console.WriteLine("Src File Path: [{0}]", dstFile); + Console.WriteLine("Dst File Path: [{0}]", dstFile); + + + using (System.IO.File.Open(srcFile, System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite | System.IO.FileShare.Delete)) + { + Alphaleonis.Win32.Filesystem.File.Move(srcFile, System.IO.Path.Combine(folder.FullName, dstFile)); + + + Assert.IsFalse(Alphaleonis.Win32.Filesystem.File.Exists(srcFile)); + + Assert.IsTrue(Alphaleonis.Win32.Filesystem.File.Exists(dstFile)); + } + } + + Console.WriteLine(); + } + } +} diff --git a/AlphaFS/Filesystem/File Class/File.GetSize.cs b/AlphaFS/Filesystem/File Class/File.GetSize.cs index 3dba25086..e534171b2 100644 --- a/AlphaFS/Filesystem/File Class/File.GetSize.cs +++ b/AlphaFS/Filesystem/File Class/File.GetSize.cs @@ -104,7 +104,7 @@ internal static long GetSizeCore(KernelTransaction transaction, SafeFileHandle s { var pathLp = Path.GetExtendedLengthPathCore(transaction, path, pathFormat, GetFullPathOptions.RemoveTrailingDirectorySeparator | GetFullPathOptions.FullCheck); - safeHandle = CreateFileCore(transaction, false, pathLp, ExtendedFileAttributes.Normal, null, FileMode.Open, FileSystemRights.ReadData, FileShare.Read, true, false, PathFormat.LongFullPath); + safeHandle = CreateFileCore(transaction, false, pathLp, ExtendedFileAttributes.Normal, null, FileMode.Open, FileSystemRights.ReadData, FileShare.ReadWrite, true, false, PathFormat.LongFullPath); } diff --git a/CHANGELOG.md b/CHANGELOG.md index 336e1e103..79be557ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Changelog ========= +Version 2.2.5 (2018-XX-XX) +------------- + +### Bugs Fixed + +- Issue #479: `File.Move` on a file opened with `FileShare.Delete` succeeds but throws `IOException`. + + Version 2.2.4 (2018-07-12) -------------