我正在尝试执行文件删除,但仅限于列表中不存在的文件。
示例:
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 :(得分: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 ,因此可能创建应删除的文件,但仍然匹配您的字符串。为了获得最佳结果,至少使用在文件名中不合法的分隔符。