在vb.net中,我无法使DirectoryInfo功能正常工作

时间:2014-07-08 20:21:55

标签: vb.net

我正在尝试执行文件删除,但仅限于列表中不存在的文件。

示例:

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)。

所以现在这似乎工作正常,但后来又担心陷入困境。

这个功能是否可以像单独迭代每个功能一样坚固?

1 个答案:

答案 0 :(得分:0)

问题在于这个表达式:

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

FilesToKeep对象的类型是List(Of String)。在ToString上调用List(Of String)会返回该类型的名称。只需删除表达式的那一部分就可以了:

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

关于你的编辑:你可能 对该编辑很好。但是,您应该知道文件名中的逗号是 legal ,因此可能创建应删除的文件,但仍然匹配您的字符串。为了获得最佳结果,至少使用在文件名中不合法的分隔符。