我有一个使用 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
,这不能在中途更改,它本质上与文件句柄相关联,当句柄关闭时,操作系统会清理文件,就是这样,没有解决方法。
如果您想要不同的行为,则必须事后自己实施。即在其关闭或不关闭后删除文件。
- 1 回答
- 0 关注
- 192 浏览
添加回答
举报
0/150
提交
取消