2013-03-29 32 views
0

所以我有两个需要帮助的功能。使用DotNetZip检查zip文件

Public Function checkZipForFiles(ByVal zipFilepath As String) 
    Try 
     Dim doc As New System.Xml.XmlDocument 
     If My.Computer.FileSystem.FileExists("Backup.xml") Then 
      doc.Load("Backup.xml") 

      Dim JobNodes As XmlNodeList = doc.GetElementsByTagName("Job") 
      For Each JobNode In JobNodes 
       Dim Source = JobNode.SelectNodes("Source") 

       For Each item As System.Xml.XmlNode In Source 
        For Each File In checkFilesInFolder(item.InnerText) 
         Using zip = ZipFile.Read(zipFilepath) 
          Dim fileName As String 
          fileName = checkFilesInFolder(item.InnerText) 
          Dim e As ZipEntry = zip(fileName) 

          If e Is Nothing Then 
           Console.WriteLine("File: " & fileName & " does not exist in zip.") 
          End If 
         End Using 
        Next 

       Next 
      Next 
     End If 
    Catch ex As Exception 
     Console.Error.WriteLine(ex.Message) 
     myLogger.Log(ex.Message) 
    End Try 

End Function 

这个读入一个xml文件。 xml文件存储压缩过程的信息,例如“目标”,“文件源”和“作业名称”。我想要这个函数检查压缩文件,看看是否所有的文件都在压缩文件中。正如你所看到的,这个函数需要借助“checkFilesiInFolder”函数来获取要在zip中搜索的文件名。

问题 - 我只返回在“checkFilesInFolder”函数中扫描的最后一个文件。

Public Function checkFilesInFolder(ByVal folderPath As String) 
    Try 
     ' make a reference to a directory 
     Dim di As New IO.DirectoryInfo(folderPath) 
     Dim diar1 As IO.FileInfo() = di.GetFiles() 
     Dim file As IO.FileInfo 

     Console.WriteLine("The following files are located in " & folderPath) 

     'list the names of all files in the specified directory 
     For Each file In diar1 
      Console.WriteLine(file.FullName) 
      'myLogger.Log(file.ToString) 

     Next 
     Return file.ToString 
    Catch ex As Exception 
     Console.Error.WriteLine(ex.Message) 
     myLogger.Log(ex.Message) 
    End Try 
End Function 

回答

0

您的checkFilesInFolder函数应该返回一个集合而不是字符串。试着改变它的定义是这样的:

Public Function checkFilesInFolder(ByVal folderPath As String) As List(Of String) 
    Dim returnList As List(Of String) = New List(Of String)() 

    Try 
     ' make a reference to a directory 
     Dim di As New IO.DirectoryInfo(folderPath) 
     Dim diar1 As IO.FileInfo() = di.GetFiles() 
     Dim file As IO.FileInfo 

     Console.WriteLine("The following files are located in " & folderPath) 

     'list the names of all files in the specified directory 
     For Each file In diar1 
      Console.WriteLine(file.FullName) 
      Console.WriteLine(file.Name) 
      returnList.Add(file.Name) 'Or FullName, depending on what you want to use 
     Next 
    Catch ex As Exception 
     Console.Error.WriteLine(ex.Message) 
    End Try 

    Return returnList 
End Function 

注意,我们使用的是List集合类来保存所有文件名。这会让你的陈述适当地工作。

我不知道,从你的使用情况,您是否需要添加file.Namefile.FullNamereturnList,但我会建议你通过调试或以其他方式都会尝试,看看哪一个对你的作品。

现在,我们有这个列表中,我们可以:

  1. 经过每个文件
  2. 检查该文件是否存在于ZIP或不

如此看来,乍一看,您的checkZipForFiles方法正在做正确的事情,但您的For循环可能只需要进行一些调整以与新集合一起工作:

For Each item As System.Xml.XmlNode In Source 
     For Each fileName As String In checkFilesInFolder(item.InnerText) 
      Using zip = ZipFile.Read(zipFilepath) 
       Dim e As ZipEntry = zip(fileName) 

       If e Is Nothing Then 
        Console.WriteLine("File: " & fileName & " does NOT exist in zip.") 
       Else 
        Console.WriteLine("File: " & fileName & " does EXIST in zip.") 
       End If 
      End Using 
     Next 
    Next 

注意这里的一些事情:我们得到一个List(Of String)checkFilesInFolder所以你For Each只是处理了一堆字符串 - 在这种情况下,它们是可以在ZIP文件通过喂养它进行检查,以zip像你这样的文件名已经在做。

相关问题