2013-03-22 9 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

플래그를 추가 한 다음 루프가 완료된 후에 플래그를 찾으십시오. 재귀 적으로 호출하는 대신 파일을 반복하는 것처럼 보입니다. 지금 당장 단 한 번의 루프 밖에 없다고 추측합니다. 루프 반복하기 전에

: 루프 반복 후

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 

: 반복의 내부

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

는 현재 반복을 완료하면

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 

그래서이의 집계를 취할 것 크기와 함께 추가 한 파일을 콘솔에 인쇄합니다. 그런 다음 변수를 0으로 설정하여 내부 루프의 다음 반복이 깨끗한 값을 갖도록합니다. 나는 당신이 하나 이상의 디렉토리에서 이것을 실행한다고 가정하고있다. FilesBeingAdded을 체크하면 디렉토리에 파일이없는 경우 추한 0 카운트 출력이 표시되는 상황을 피할 수 있습니다.

이 솔루션은 사용자가이 코드를 입력하는 방법에 대해 많이 추측합니다. 내 생각이 정확하지 않은 경우 더 나은 솔루션을 사용하려면 질문을 수정하십시오.

+0

변경 될 수있는 한 가지 사실은 For 문을 사용한다는 사실입니다. 위의 편집을 확인하십시오 – MaylorTaylor

+0

사실 그것이 정확히 당신이 그것을 할 수도 있다고 생각합니다. 내 대답의 'After loop iteration' 섹션을 내부 루프 뒤의 외부 루프 본문에 추가합니다. –

+0

완료되었습니다. 고마워요. 나는 결코 그런 것을 할 필요가 없었지만 그것은 합리적입니다. – MaylorTaylor