在 FileStream 上撤消 DeleteOnClose

我有一个使用 FileOption:DeleteOnClose 在内部使用 FileStream 的类。正常行为是当我为类分配文件名时,我不使用 DeleteOnClose,否则我使用它。


唯一的问题是我有时需要撤消DeleteOnClose。


我在这里解释更深的细节会太长。当然,我可以创建一个副本并将已使用 DeleteOnClose 打开的 FileStream 的内容复制到另一个 FileStream,但文件大小太大(> = 30GB),因此这种方法是不切实际的。


手动删除文件不起作用,因为这些类或多或少用作需要由 GC 处理的内存容器。此外,当发生某些事情时,放置死文件也无济于事。


所以我希望是否有办法撤消 DeleteOnClose 属性,因为这可以完成,例如使用 SetFileAttributes,例如可以设置/取消设置临时标志。


根据 TheGeneral 和 TonPlooij 的评论,我创建了一个小示例来测试 FileDispositionInfo,但不知何故这也不起作用(从http://source.roslyn.codeplex.com/#Roslyn.Test.Utilities/TempFiles/DisposableFile复制。 cs,4d5c94058d1b4cd3):


using Microsoft.Win32.SafeHandles;

using System;

using System.IO;

using System.Runtime.InteropServices;


namespace ConsoleApp11

{

    class Program

    {

        [DllImport("kernel32.dll", PreserveSig = false)]

        private static extern void SetFileInformationByHandle(SafeFileHandle handle, int fileInformationClass, ref uint fileDispositionInfoDeleteFile, int bufferSize);


        private const int FileDispositionInfo = 4;


        internal static void PrepareDeleteOnCloseStreamForDisposal(FileStream stream)

        {

            // tomat: Set disposition to "delete" on the stream, so to avoid ForeFront EndPoint

            // Protection driver scanning the file. Note that after calling this on a file that's open with DeleteOnClose, 

            // the file can't be opened again, not even by the same process.

            uint trueValue = 1;

            SetFileInformationByHandle(stream.SafeFileHandle, FileDispositionInfo, ref trueValue, sizeof(uint));

        }

        }

    }

}


慕码人8056858
浏览 193回答 1
1回答

白衣染霜花

要直接回答您的问题,不,您不能在中途更改选项。文件流使用 winapi 标志FILE_FLAG_DELETE_ON_CLOSE,这不能在中途更改,它本质上与文件句柄相关联,当句柄关闭时,操作系统会清理文件,就是这样,没有解决方法。如果您想要不同的行为,则必须事后自己实施。即在其关闭或不关闭后删除文件。
打开App,查看更多内容
随时随地看视频慕课网APP