2013-08-06 53 views
3

我想要一個函數,它使用c#代碼在回收站(在win 7上)中檢索我的文件名。框架似乎沒有什麼可以包含來實現這一點。使用c#在recyclebin中列出文件名,而不使用任何外部文件

Directory.Getfiles()將無法​​正常工作嗎?

我發現自己的代碼使用「Windows Shell32自動化」,但這需要提供interop.shell32.dll,必須重新分配我的應用程序。由於我的應用程序應該獨立運行(只要用戶計算機上存在Net Framework 2),該解決方案並不理想。 這個解決方案對我來說似乎也是不可靠的,因爲它使用COM Automation,並且一些引用可能失敗或者調用Namespace(10)可能失敗。我甚至不確定命名空間(10)是否始終是回收站的正確文件夾。 這段代碼就是我在這件事上爲C#找到的。

我發現了一個Delphi和代碼項目上的另一個實現,但是如果我在C#項目中複製該代碼,它實際上全是紅色下劃線,並且不會編譯。我不確定如何更正此代碼以使其在C#中可用。在pinvoke.net上,我找不到windows函數的代碼,我不得不使用它(SHQueryRecycleBin),但也許我必須使用更多的函數從回收站中獲取文件列表。

有沒有人看過一個代碼或任何想法?

+2

好吧,如果你在一些Delphi代碼複製,也可能不會用C#編寫... – feralin

+1

這是正確的,C++代碼不會用C#編譯器編譯。你只能用C#編譯器編譯C#;因此名稱(「C#編譯器」)... – feralin

+1

@feedwall很多與Visual Studio兼容,並不意味着與Visual Studio兼容的每種語言都將使用C#編譯器。弗拉林說:您只能用C#編譯器編譯C#。 – madbrendon

回答

3

如果在您的應用程序添加到基準C:\Windows\System32\Shell32.dll您可以輕鬆地訪問該文件的文件名中Recyle斌

例子:

using Shell32; 

    public IEnumerable<string> GetRecycleBinFilenames() 
    { 
     Shell shell = new Shell(); 
     Folder recycleBin = shell.NameSpace(10); 

     foreach (FolderItem2 recfile in recycleBin.Items()) 
     { 
      // Filename 
      yield return recfile.Name; 

      // full recyclepath 
      // yield return recfile.Path; 
     } 

     Marshal.FinalReleaseComObject(shell); 
    } 

如果創建額外的文件困擾你,你可以嵌入它的可執行

enter image description here

+1

如果你不想額外的文件,將'Shell32'的屬性設置爲'Embed Iterop Types',這將在任何Win7機器上工作 –

+1

添加圖片設置的位置,它應該在較舊的Windows版本上向後兼容,但是我可以'現在進行測試 –

相關問題