2013-03-22 154 views
0

我有一个逻辑问题,只需要更多的工作就可以了。DotNetZip循环逻辑的逻辑帮助

For Each JobNode In JobNodes 
        Dim Source = JobNode.SelectNodes("Source") 
        For Each item As System.Xml.XmlNode In Source 
         Dim infoReader As System.IO.FileInfo 

         ''''Discerns whether a file or directory 

         If item.InnerText.Contains(".") Then 'is a file 

          If Dir$(item.InnerText) <> vbNullString Then 
           mySize += FileLen(item.InnerText) 
          End If 


          zip.AddFile(item.InnerText, "") 


          Dim numFiles2 = filenames.Count 
          mySize = BytesTO(mySize, convTo.MB) 
          Console.WriteLine("...Added all " & numFiles2 & " files. Total loose file collection size is " & Math.Round(mySize, 2) & " MB") 
          Console.WriteLine(vbCrLf) 


         Else 'is a directory 

          zip.AddDirectory(item.InnerText, GetLastDirName(item.InnerText & " ")) 
          Dim dinfo As New DirectoryInfo(item.InnerText) 
          Dim sizeOfDir As Long = DirectorySize(dinfo, True) 
          Dim numFiles As Integer = CountFiles_FolderAndSubFolders(item.InnerText) 

          Console.WriteLine("...Added all " & numFiles & " files. Total directory size is {0:N2} MB", (CDbl(sizeOfDir))/(1024 * 1024)) 
          Console.WriteLine(vbCrLf) 
         End If 

        Next 

这是我制作的备份程序的一部分。这是确定要添加到zip的对象是文件(IF语句的第一部分)还是目录(IF语句的ELSE部分)的部分。

我的问题是,我试图添加以下代码:

Dim numFiles2 = filenames.Count 
mySize = BytesTO(mySize, convTo.MB) 
Console.WriteLine("...Added all " & numFiles2 & " files. Total loose file collection size is " & Math.Round(mySize, 2) & " MB") 
Console.WriteLine(vbCrLf) 

就在zip.AddFile(item.innertext,"")部分之后。我想添加这个,这样我就可以从控制台打印出这些信息。

问题是,如果我只是把它放在zip.addfile()之后,它会直接在每次上面输出代码。我只希望它打印出来的那部分(正上方),一旦完成将所有松散的文件(或文件添加使用zip.AddFile()

编辑:添加在顶环更多的澄清

回答

1

添加一个标志,然后在循环完成后查找它。看起来好像你在循环文件而不是递归地调用它。我猜你现在只有一个循环。

循环迭代之前:

Dim FilesBeingAdded as Boolean = False 
Dim numFiles2 as Integer = 0 

内迭代:

If item.InnerText.Contains(".") Then 'is a file 
    If FilesBeingAdded = False Then 
     FilesBeingAdded = true   
    End If 

    If Dir$(item.InnerText) <> vbNullString Then 
     mySize += FileLen(item.InnerText) 
    End If 

    zip.AddFile(item.InnerText, "") 
    numFiles2 +=1 

Else 'is a directory 
    zip.AddDirectory(item.InnerText, GetLastDirName(item.InnerText & " ")) 
    Dim dinfo As New DirectoryInfo(item.InnerText) 
    Dim sizeOfDir As Long = DirectorySize(dinfo, True) 
    Dim numFiles As Integer = CountFiles_FolderAndSubFolders(item.InnerText) 

    Console.WriteLine("...Added all " & numFiles & " files. Total directory size is {0:N2} MB", (CDbl(sizeOfDir))/(1024 * 1024)) 
    Console.WriteLine(vbCrLf) 
End If 

循环迭代后:

If FilesBeingAdded = True Then 
    mySize = BytesTO(mySize, convTo.MB) 
    Console.WriteLine("...Added all " & numFiles2 & " files. Total loose file collection size is " & Math.Round(mySize, 2) & " MB") 
    Console.WriteLine(vbCrLf) 
    mySize = 0 
    numFiles2 = 0 
    FilesBeingAdded = False 
End If 

所以当它完成当前迭代将采取的理货它添加的文件以及大小并打印到控制台。然后它将变量清零,以便内循环的下一次迭代具有干净的值。我假设你在多个目录上运行这个。通过检查FilesBeingAdded,您可以确保避免在目录中不包含文件时显示丑陋的零计数输出的情况。

这个解决方案假设了很多关于你如何输入这段代码。如果我的推定不正确,请修改问题以启用更好的解决方案。

+0

有一件事可能会改变这是我使用For语句的事实。检查上面的编辑 – MaylorTaylor 2013-03-22 19:06:36

+0

其实这正是我以为你可能会这样做。在内部循环之后,您可以将我的答案的“循环迭代”部分添加到外部循环的主体中。 – 2013-03-22 19:09:00

+0

完成了。谢谢先生。我从来不需要做那样的事情,但它总是有意义的。 – MaylorTaylor 2013-03-22 19:16:18