2008-08-20 52 views

回答

15

您需要深入研究非託管代碼。下面是我一直在使用一個靜態類:

public static class Recycle 
{ 
    private const int FO_DELETE = 3; 
    private const int FOF_ALLOWUNDO = 0x40; 
    private const int FOF_NOCONFIRMATION = 0x0010; 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)] 
    public struct SHFILEOPSTRUCT 
    { 
     public IntPtr hwnd; 
     [MarshalAs(UnmanagedType.U4)] 
     public int wFunc; 
     public string pFrom; 
     public string pTo; 
     public short fFlags; 
     [MarshalAs(UnmanagedType.Bool)] 
     public bool fAnyOperationsAborted; 
     public IntPtr hNameMappings; 
     public string lpszProgressTitle; 
    } 

    [DllImport("shell32.dll", CharSet = CharSet.Auto)] 
    static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); 

    public static void DeleteFileOperation(string filePath) 
    { 
     SHFILEOPSTRUCT fileop = new SHFILEOPSTRUCT(); 
     fileop.wFunc = FO_DELETE; 
     fileop.pFrom = filePath + '\0' + '\0'; 
     fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; 

     SHFileOperation(ref fileop); 
    } 
} 

附錄:

  • 嘖嘖@傑夫在C#代碼 「使用Microsoft.VisualBasic程序」。
  • Tsk tsk @ MS將所有好東西放在VisualBasic命名空間中。
+11

我想這是其中之一VB只是比C#更好的區域......此外,它不是僅僅因爲它在VB命名空間中而是「不是C#」 - 一個對象是一個對象,不要僅僅因爲它位於名稱空間而不喜歡它的名稱就使用它有點荒謬你不覺得嗎?... – BenAlabaster 2008-12-22 15:18:19

+9

...如果命名空間是Microsoft.UsefulUtilities你不會對使用它們有所保留,那有什麼區別? – BenAlabaster 2008-12-22 15:18:54

13

我發現最好的方法是使用VB功能FileSystem.DeleteFile

Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile(file.FullName, 
    Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs, 
    Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin); 

它需要添加Microsoft.VisualBasic作爲參考,但是這是.NET框架的一部分,所以不是一個額外的依賴。

替代解決方案需要P/Invoke到SHFileOperation,以及定義所有各種結構/常量。包括Microsoft.VisualBasic比較整齊。

相關問題