为了账号安全,请及时绑定邮箱和手机立即绑定

在 FileStream 上撤消 DeleteOnClose

在 FileStream 上撤消 DeleteOnClose

C#
慕码人8056858 2021-10-09 10:02:24
我有一个使用 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));        }        }    }}
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

要直接回答您的问题,不,您不能在中途更改选项。文件流使用 winapi 标志FILE_FLAG_DELETE_ON_CLOSE,这不能在中途更改,它本质上与文件句柄相关联,当句柄关闭时,操作系统会清理文件,就是这样,没有解决方法。

如果您想要不同的行为,则必须事后自己实施。即在其关闭或不关闭后删除文件。


查看完整回答
反对 回复 2021-10-09
  • 1 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信