2014-07-08 29 views
1

我想只有在不列表中存在的文件執行文件刪除,但。在vb.net,我不能讓我的DirectoryInfo功能才能正常工作

實施例:

Dim FilesToKeep As List(Of String) = MyFunctionThatPopulatesTheList 

的FilesToKeep列表包括文件名。

這裏就是我有麻煩,因爲這些條款功能把我關大時間。

Dim filesToDelete 

filesToDelete = New DirectoryInfo(FilePath) _ 
    .GetFiles("*", SearchOption.AllDirectories) _ 
    .Where(Function(f) Not f.Attributes.HasFlag(FileAttributes.Hidden)) _ 
    .Where(Function(f) Not FilesToKeep.ToString.Contains(f.Name)) _ 
    .[Select](Function(f) New FileCollectionForDelete(f)).ToArray() 

我想要做的兩件事情,如果你看看DirectoryInfo函數的底部兩行。我只想要FilesToKeep列表中不存在的文件。第二,只是幫助我存儲有關文件的信息。

但因爲它的立場,filesToDelete返回的每一個文件。

謝謝你的幫助。

===========編輯=============

的意見後,我給它一個鏡頭,但好奇,如果任何人都可以提供有關意見這個功能的穩定性。

首先,我創建了一個名爲FilesToKeep2

Dim FilesToKeep2 As String = String.Join(",", FilesTOKeep.ToArray()) 

另一個變量,我離開了我的功能究竟是怎麼回事,因爲它不是比較整個路徑,注意(f.Name)。

所以現在這似乎能正常工作,但擔心的疑難雜症是以後。

這個函數能夠像逐個遍歷每個函數一樣穩定嗎?

+0

嘗試刪除Where子句,然後逐個添加它們並查看所得結果。 –

+0

是不是完整路徑與文件名問題的問題?也許'FilesToKeep'具有完整路徑的文件名,而'f.Name'只有文件名? –

+0

@KonradKokosa好主意......現在就來試試吧。 – user1447679

回答

0

問題是這樣的表達式:

Function(f) Not FilesToKeep.ToString.Contains(f.Name) 

的類型FilesToKeep對象的是List(Of String)。在List(Of String)上調用ToString將返回類型的名稱。只是刪除了表達的那部分,你會被罰款:

Function(f) Not FilesToKeep.Contains(f.Name) 

另外,我覺得你的東西得太多與最終.Select()。完全跳過(和.ToArray()調用)。

最終代碼:

Dim FilesToKeep As List(Of String) = MyFunctionThatPopulatesTheList()  

Dim filesToDelete = (New DirectoryInfo(FilePath)).GetFiles("*", SearchOption.AllDirectories). 
    Where(Function(f) Not f.Attributes.HasFlag(FileAttributes.Hidden)). 
    Where(Function(f) Not FilesToKeep.Contains(f.Name)) 

For Each fileName As String In filesToDelete 
    File.Delete(fileName) 
Next 

關於您的編輯:你可能罰款與編輯。但是,你應該知道,逗號是法律文件名,因此它的可能創建要刪除的文件,但仍然會符合您的字符串。爲獲得最佳效果,至少應使用文件名中不合法的分隔符。