C# 强制删除文件,即使其他进程正在使用该文件

C# 强制删除文件,即使其他进程正在使用该文件,c#,.net,C#,.net,我正在开发一个应用程序,它需要删除一个文件,无论它被其他进程使用 考虑以下代码片段 using System; using System.IO; namespace DotNet_Concepts.File_Operation { class Deleting_File_Which_Is_In_Use { static void Main(string[] args) { StreamReader lclFileStrea


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

考虑以下代码片段

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();
        }
    }
}
我正在删除同一进程使用的文件。是否可以删除该文件

谢谢, 阿米特·沙阿

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


只需先关闭文件…

是的,这是一个已知的Windows安全问题,称为“句柄回收攻击”。从技术上讲,可以遍历未记录的内核句柄表,在拥有句柄的进程中注入代码,并调用CloseHandle()关闭文件句柄。很难利用,你需要管理员权限才能做到这一点。如果你有权利的话,那就用更好的方法来搞乱一个过程

结果更多的是一种拒绝服务攻击,这种攻击会随机地破坏机器,而无法找出它是如何发生的。进程没有意识到文件句柄已关闭,它没有关闭它,只是继续写入句柄。写入的数据落入位存储桶。在大多数非托管程序中,忽略WriteFile()的返回值是非常标准的

直到进程打开另一个句柄写入(比如)数据库。句柄被回收,它可以得到相同的句柄值。现在,这个过程正在写入正常的数据库数据,与现在关闭的文件中应该包含的数据混合在一起


当任何人试图从数据库中读回数据时,欢闹就会接踵而至。或者其他任何资源被破坏,都是随机的。不过,您有点被覆盖了,没有人能够确定是您的程序破坏了机器。

但是文件正在使用中。那么为什么要删除它呢?重复-?如果你想关闭打开的文件,你的问题还不清楚。如果是这种情况,请使用Ed Swangren的建议。在关闭流之前删除文件的目的是什么?如果出于参数考虑,您在关闭流之前找到了删除文件的方法,那么在删除文件后,流对您有什么用途?上述代码仅用于显示错误。我有一个使用wav文件的托管swf文件。我有一个后端应用程序,它修改swf使用的同一个wave文件。我希望更新后的波浪在swf中渲染。唯一的方法是替换现有文件,如果您的文件被其他进程使用,您可以尝试CreateRemoteThread()关闭句柄。上面的代码仅用于显示错误。我有一个使用wav文件的托管swf文件。我有一个后端应用程序,它修改swf使用的同一个wave文件。我希望更新后的波浪在swf中渲染。唯一的方法是替换现有的文件。你假设这是“唯一的方法”。这不是“强制的”。如果文件正在使用,代码将抛出异常。此外,OP使用的File.Delete(path)将执行与使用FileInfo.Delete()完全相同的操作。
using System.Collections;
using System.Diagnostics;
using System.Management;

if (File.Exists(@"D:\New folder\Test0001.wav"))
{
    GC.Collect();
    GC.WaitForPendingFinalizers();
    FileInfo f = new FileInfo(@"D:\New folder\Test0001.wav");
    f.Delete();
}