为什么每个String都写入不同的文件?

时间:2014-07-22 16:08:45

标签: vb.net loops visual-studio-2012 file-io system

我正在尝试生成基于大小的文件列表。传递的当前大小是每个文本文件10 MB的文件名。它将每个文件名写入其自己的单个文件,而不是计数到10 MB然后递增版本字母。这很奇怪,因为每个文件大约150 kb,但我无法弄清楚它为什么报告总数为>每次代码循环时编号。

Private Function GenerateListsForSize(source As String, destination As String, name As String, number As Integer)
    Dim files As ArrayList = New ArrayList
    Dim total As Integer
    Dim version As Char = "A"
    Dim path As String
    Dim counter As Integer = 0
    Dim passTexts As ArrayList = New ArrayList
    Dim infoReader As System.IO.FileInfo

    For Each foundFile As String In My.Computer.FileSystem.GetFiles(source)
        files.Add(foundFile)
    Next

    If files.Count > 1 Then                 'If files exist in dir, count them and get how many lists

        path = destination & "\" & name & version & ".txt"
        Dim fs As FileStream = File.Create(path)        'creates the first text file
        fs.Close()
        passTexts.Add(path)

        For Each foundfile As String In files
            Using sw As StreamWriter = New StreamWriter(path)
                Console.WriteLine(foundfile)
                sw.WriteLine(foundfile)
            End Using
            infoReader = My.Computer.FileSystem.GetFileInfo(foundfile)
            total = total + infoReader.Length
            If total >= number Then                         'If max file size is reached
                version = Chr(Asc(version) + 1)                     'Increments Version
                path = destination & "\" & name & version & ".txt"      'Corrects path
                fs = File.Create(path)        'creates the new text file with updated path
                fs.Close()
                passTexts.Add(path)
                total = 0                   'resets total
            End If
        Next
    End If


    Return passTexts




End Function

1 个答案:

答案 0 :(得分:0)

每次循环时,都会打开文件(使用StreamWriter),覆盖以前的内容。您的文件中只有一个文件名。不是每次都通过循环打开和写入,而是只在累积所有文件名时写入文件。我删除了对File.Create的调用,因为它们不是必需的。如果文件不存在,StreamWriter将创建该文件。我将ArrayList更改为List(Of String),因为它们更容易使用。此外,请务必关闭Option Strict On。此代码尚未经过测试,但它应该得到我的观点。我希望我没有误解你的想法。

Private Function GenerateListsForSize(source As String, destination As String, name As String, number As Integer) As List(Of String)
    Dim files As New List(Of String)()
    Dim filenamesToWrite As New List(Of String)()
    Dim total As Integer
    Dim version As Char = "A"
    Dim filename As String
    Dim counter As Integer = 0
    Dim passTexts As New List(Of String)()
    Dim infoReader As System.IO.FileInfo

    files.AddRange(My.Computer.FileSystem.GetFiles(source))

    If files.Count > 1 Then                 'If files exist in dir, count them and get how many lists

        'Path.Combine is preferable to concatenating strings.
        filename = Path.Combine(destination, String.Format("{0}{1}.txt", name, version))
        passTexts.Add(filename)

        For Each foundfile As String In files
            filenamesToWrite.Add(foundfile)
            infoReader = My.Computer.FileSystem.GetFileInfo(foundfile)
            total = total + infoReader.Length
            If total >= number Then                         'If max file size is reached

                'Only write when the list is complete for this batch.
                Using sw As StreamWriter = New StreamWriter(filename)
                    For Each fname As String In filenamesToWrite
                        Console.WriteLine(foundfile)
                        sw.WriteLine(foundfile)
                    Next
                End Using

                version = Chr(Asc(version) + 1)                     'Increments Version
                filename = Path.Combine(destination, String.Format("{0}{1}.txt", name, version)) 'corrects path
                passTexts.Add(filename)   'IS THIS A DUPLICATE????
                total = 0                  'resets total
                filenamesToWrite.Clear()  'clear the list of file names to write
            End If
        Next
    End If

    Return passTexts

End Function