Почему каждая строка записывается в другой файл?

Вопрос:

Я пытаюсь создать список файлов на основе размера. Пропуск текущего размера составляет 10 МБ имен файлов в текстовом файле. Вместо того, чтобы подсчитывать до 10 МБ и затем увеличивать букву версии, она записывает каждое имя файла в отдельный файл. Это странно, так как каждый файл ~ 150 кб, но я не могу понять, почему он сообщает об итогах как> число каждый раз, когда цикл цикла.

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

Лучший ответ:

Каждый раз через цикл вы открываете файл (используя StreamWriter), который перезаписывает предыдущее содержимое. В вашем файле будет только одно имя файла внутри него. Вместо того чтобы открывать и писать каждый раз через цикл, записывайте файл только тогда, когда вы накопили все имена файлов. Я удалил вызовы в File.Create, поскольку они не нужны. StreamWriter создаст файл, если он не существует. И я сменил ArrayList на List (Of String), так как с ними легче работать. Кроме того, обязательно включите опцию 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

Оцените статью
TechArks.Ru
Добавить комментарий