即使正在被其他进程使用,也会强制删除文件

Ami*_*hah 5 .net c#


我正在开发一个应用程序,它需要删除文件,无论其他进程是否正在使用它

请考虑以下代码段.

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)

我正在删除同一进程使用的文件.是否可以删除该文件

谢谢,阿米特沙阿

Han*_*ant 7

是的,这是一个已知的Windows安全问题,称为"句柄循环攻击".从技术上讲,可以遍历未记录的内核句柄表,在拥有句柄的进程中注入代码并调用CloseHandle()来关闭文件句柄.很难利用,您需要管理员权限才能执行此操作.如果你有这个权利,那就更好地搞砸了一个过程.

什么结果更多的是拒绝服务攻击,一个随机收拾机器,无法找出它是如何发生的.该进程不知道文件句柄已关闭,它没有关闭它,只是继续写入句柄.写入的数据属于位桶.在大多数非托管程序中,忽略WriteFile()的返回值是非常标准的.

直到进程打开另一个句柄来写入数据库.把手被回收,它可以获得相同的把手价值.现在,该过程正在编写正常的数据库数据,与应该在现在关闭的文件中的数据混合在一起.

当任何人试图从该数据库中读回数据时,就会发生欢闹.或者无论其他资源被破坏,它都是随机的.你有点被覆盖,没有人能够弄清楚是你的程序破坏了机器.


Ed *_* S. 0

我正在删除同一进程使用的文件

先关闭文件...