2010-07-24 50 views
5


我正在開發需要刪除的文件不管它正被其他進程刪除文件強制即使它正在被其他進程

考慮下面的代碼片段一個應用程序。

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 
      { 
       [email protected]"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(); 
     } 
    } 
} 

我正在刪除同一進程使用的文件。是否可以刪除的文件

感謝, 阿米特·沙阿

+0

但該文件正在使用中。那麼爲什麼要刪除它? – 2010-07-24 06:34:40

+2

複製 - http://stackoverflow.com/questions/1040/how-do-i-delete-a-file-which-is-locked-by-another-process-in-c? – 2010-07-24 06:37:47

+0

如果您想關閉您打開的文件,則不清楚您的問題。如果是這種情況,請使用Ed Swangren的建議。 – 2010-07-24 06:42:53

回答

1

我刪除它使用相同的工藝

就先關閉該文件的文件...

+0

,如果您的文件被其他進程使用,您可以嘗試CreateRemoteThread()來關閉句柄。 – fardjad 2010-07-24 06:42:46

+0

以上代碼僅用於顯示錯誤。 我有一個使用wav文件的託管swf文件。 我有一個後端應用程序,它修改了swf使用的同一個wave文件。我希望更新後的wave以swf呈現。唯一的方法是替換現有的文件。 – 2010-07-24 06:45:32

+0

你認爲這是「唯一的方式」。 – 2010-07-24 19:37:03

6

是的,這是一個已知的Windows安全性的關注,被稱爲「手柄回收攻擊」。在技​​術上可以行走未記錄的內核句柄表,在擁有該句柄的進程中注入代碼並調用CloseHandle()來關閉文件句柄。很難利用,你需要管理員權限來做到這一點。如果你有這個權利,更好的方法來搞砸一個過程。

什麼結果是更多的拒絕服務攻擊,其中一個隨機嘲笑機器無法找出它是如何發生的。該進程沒有意識到文件句柄已關閉,沒有關閉它,只是繼續寫入句柄。寫入的數據落入位桶中。忽略WriteFile()的返回值在大多數非託管程序中是非常標準的。

直到進程打開另一個手柄寫,說,一個數據庫。手柄被回收,它可以得到相同的手柄值。現在,這個過程正在寫入正常的數據庫數據,並與現在應該關閉的文件中的數據混合在一起。

當有人試圖從數據庫中讀回數據時,就會出現Hilarity。或者其他任何資源被破壞,這是隨機的。雖然你有點被覆蓋,但是沒有人能夠發現它是你的程序摧毀了機器。

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

這不是「強力」。如果文件正在使用中,代碼將拋出異常。同樣,使用OP所使用的File.Delete(path)將完成與使用FileInfo.Delete()所做的完全相同的事情。 – 2014-06-18 09:12:29

相關問題