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();
}