我有一个使用 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));
}
}
}
}
白衣染霜花
相关分类