コード例 #1
0
 public void CreateReplacementFileInitiallyAbsent()
 {
     using (FileStream fs = FileUtilities.CreateReplacementFile(GetFullPath("Ghost"), FileShare.Read | FileShare.Delete))
     {
         XAssert.IsNotNull(fs);
         XAssert.AreEqual(0, fs.Length);
         fs.WriteByte(1);
     }
 }
コード例 #2
0
        public void CreateReplacementFileCanReplaceRunningExecutableLink()
        {
            string exeLink = GetFullPath("DummyWaiterLink");

            XAssert.IsTrue(CreateHardLinkIfSupported(link: exeLink, linkTarget: DummyWaiter.GetDummyWaiterExeLocation()));

            using (var waiter = DummyWaiter.RunAndWait())
            {
                using (FileStream fs = FileUtilities.CreateReplacementFile(exeLink, FileShare.Delete))
                {
                    XAssert.AreEqual(0, fs.Length);
                }
            }
        }
コード例 #3
0
        public void CreateReplacementFileReplacesFileEvenIfTruncationWasPossible()
        {
            const string Target = @"Target";

            FileId originalId;

            using (FileStream original = File.Create(GetFullPath(Target)))
            {
                originalId = FileUtilities.ReadFileUsnByHandle(original.SafeFileHandle).Value.FileId;
            }

            using (FileStream fs = FileUtilities.CreateReplacementFile(GetFullPath(Target), FileShare.Read | FileShare.Delete))
            {
                XAssert.IsNotNull(fs);
                XAssert.AreNotEqual(originalId, FileUtilities.ReadFileUsnByHandle(fs.SafeFileHandle).Value.FileId, "File was truncated rather than replaced");
                XAssert.AreEqual(0, fs.Length);
                fs.WriteByte(1);
            }
        }
コード例 #4
0
        public void CreateReplacementFileCanReplaceMemoryMappedFile()
        {
            string file = GetFullPath("File");
            string link = GetFullPath("link");

            WithNewFileMemoryMapped(
                file,
                () =>
            {
                if (!CreateHardLinkIfSupported(link: link, linkTarget: file))
                {
                    return;
                }

                using (FileStream fs = FileUtilities.CreateReplacementFile(link, FileShare.Delete))
                {
                    XAssert.AreEqual(0, fs.Length);
                }
            });
        }
コード例 #5
0
        public void CreateReplacementFileReplacesAfterRemovingReadonlyFlagIfDenyWriteACLPresent()
        {
            const string Target = @"Target";

            FileId originalId;

            using (FileStream original = File.Create(GetFullPath(Target)))
            {
                originalId = FileUtilities.ReadFileUsnByHandle(original.SafeFileHandle).Value.FileId;
            }

            SetReadonlyFlag(GetFullPath(Target));
            AddDenyWriteACL(GetFullPath(Target));

            using (FileStream fs = FileUtilities.CreateReplacementFile(GetFullPath(Target), FileShare.Read | FileShare.Delete))
            {
                XAssert.IsNotNull(fs);
                XAssert.AreNotEqual(originalId, FileUtilities.ReadFileUsnByHandle(fs.SafeFileHandle).Value.FileId, "File was truncated rather than replaced");
                XAssert.AreEqual(0, fs.Length);
                fs.WriteByte(1);
            }
        }