将字符串列表中的文件与目标目录中的文件进行比较

时间:2015-09-13 19:31:20

标签: vb.net

我已经搜索了这个问题2天,没有找到解决方案。由于我对该主题的了解有限,我可能会使用错误的搜索词。

我有2个文件夹,一个源和一个目标,每个文件夹都包含文件。我需要比较这两个目录中的文件,并在从源目录移动文件之前从目标目录中删除重复文件。

我为两个目录创建了一个字符串列表。但我似乎无法弄清楚如何使targetdir中的欺骗被删除而不是从列表中删除。但是,如果我将targetdir或sourcedir放在File.Exists()和File.Delete()中,它就不会看到这些文件。

我的代码如下。任何人都可以帮我这个吗?

Dim sourcedir As String
        sourcedir = TextBox1.Text + "\"
        Dim targetdir As String
        targetdir = readValue + "\"
        For Each filename In filelist
            If System.IO.File.Exists(filename) Then
                System.IO.File.Delete(filename)
            End If
        Next

编辑: 非常感谢你。这是我使用的代码,以防其他人遇到同样的问题。

Dim sourcedir As String
        sourcedir = TextBox1.Text + "\"
        Dim targetdir As String
        targetdir = readValue + "\"
        Dim sourceFilePaths = My.Computer.FileSystem.GetFiles(sourcedir, FileIO.SearchOption.SearchAllSubDirectories)
        Dim targetFilePaths = My.Computer.FileSystem.GetFiles(targetdir, FileIO.SearchOption.SearchAllSubDirectories)

        'Compare only file names, ignoring paths, and get a list of duplicates.
        Dim duplicateFileNames = sourceFilePaths.Select(Function(filePath) System.IO.Path.GetFileName(filePath)).
                                                 Intersect(targetFilePaths.Select(Function(filePath) System.IO.Path.GetFileName(filePath)))

        'Combine target folder path with duplciate file names and delete each one.
        For Each filePath In duplicateFileNames.Select(Function(fileName) System.IO.Path.Combine(targetdir, fileName))
            System.IO.File.Delete(filePath)
            Application.DoEvents()
        Next

1 个答案:

答案 0 :(得分:0)

E.g。

Dim sourceFolderPath = "C:\SourceFolder"
Dim targetFolderPath = "C:\TargetFolder"

Dim sourceFilePaths = Directory.GetFiles(sourceFolderPath)
Dim targetFilePaths = Directory.GetFiles(targetFolderPath)

'Compare only file names, ignoring paths, and get a list of duplicates.
Dim duplicateFileNames = sourceFilePaths.Select(Function(filePath) Path.GetFileName(filePath)).
                                         Intersect(targetFilePaths.Select(Function(filePath) Path.GetFileName(filePath)))

'Combine target folder path with duplciate file names and delete each one.
For Each filePath In duplicateFileNames.Select(Function(fileName) Path.Combine(targetFolderPath, fileName))
    File.Delete(filePath)
Next

这是一个不使用LINQ的选项:

Dim sourceFolderPath = "C:\SourceFolder"
Dim targetFolderPath = "C:\TargetFolder"

Dim sourceFilePaths = Directory.GetFiles(sourceFolderPath)
Dim targetFilePaths = Directory.GetFiles(targetFolderPath)

Dim sourceFileNames As New List(Of String)

For Each sourceFilePath In sourceFilePaths
    sourceFileNames.Add(Path.GetFileName(sourceFilePath))
Next

For Each targetFilePath In targetFilePaths
    Dim targetFileName = Path.GetFileName(targetFilePath)

    If sourceFileNames.Contains(targetFileName) Then
        File.Delete(targetFilePath)
    End If
Next

值得注意的是,这两个示例都区分大小写。 IntersectContains方法都会接受IEqualityComparer(Of String),因此您可以提供一个使它们不区分大小写。