我正在开发一个应用程序,它需要删除文件,无论其他进程是否正在使用它
请考虑以下代码段.
using System;
using System.IO;
namespace DotNet_Concepts.File_Operation
{
class Deleting_File_Which_Is_In_Use
{
static void Main(string[] args)
{
StreamReader lclFileStream = null;
string lclFileName=string.Empty;
try
{
lclFileName=@"E:\Visual Studio 2008 Projects\DotNet Concepts\DotNet Concepts\Local Files\Garbage.txt";
if (File.Exists(lclFileName))
{
lclFileStream = new StreamReader(lclFileName);
if (lclFileStream != null)
{
//Doing some operation
}
//Deleting the file before closing the stream
File.Delete(lclFileName);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.StackTrace);
}
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在删除同一进程使用的文件.是否可以删除该文件
谢谢,阿米特沙阿
是的,这是一个已知的Windows安全问题,称为"句柄循环攻击".从技术上讲,可以遍历未记录的内核句柄表,在拥有句柄的进程中注入代码并调用CloseHandle()来关闭文件句柄.很难利用,您需要管理员权限才能执行此操作.如果你有这个权利,那就更好地搞砸了一个过程.
什么结果更多的是拒绝服务攻击,一个随机收拾机器,无法找出它是如何发生的.该进程不知道文件句柄已关闭,它没有关闭它,只是继续写入句柄.写入的数据属于位桶.在大多数非托管程序中,忽略WriteFile()的返回值是非常标准的.
直到进程打开另一个句柄来写入数据库.把手被回收,它可以获得相同的把手价值.现在,该过程正在编写正常的数据库数据,与应该在现在关闭的文件中的数据混合在一起.
当任何人试图从该数据库中读回数据时,就会发生欢闹.或者无论其他资源被破坏,它都是随机的.你有点被覆盖,没有人能够弄清楚是你的程序破坏了机器.