在数组的循环中附加文本文件只打印第一个文件的一个字母

Appending text files in a loop on array only prints 1 letter of first file

我有一个文件夹 C:\test\,其中包含多个 .txt 文件,我需要将这些文件附加到一个输出文本文件。使用 FSO 和 TextStream 我可以以这种方式毫无问题地显式写入文件:

Public Sub test()
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    Const Path As String = "C:\test\"

    Dim helloWorld As Object
    Set helloWorld = FSO.CreateTextFile(FileName:=(Path & "helloworld.txt"), OverWrite:=True, Unicode:=False)

    helloWorld.WriteLine FSO.GetFile("C:\test\Product_ID_update.txt").OpenAsTextStream(ForReading).ReadAll
    helloWorld.WriteLine FSO.GetFile("C:\test\RPT-4475.txt").OpenAsTextStream(ForReading).ReadAll

    helloWorld.Close
End Sub

它工作得很好,但我有数百个文件要追加,所以将它们全部键入会很疯狂,所以我写了一些代码将所有文件名放入一个数组中,然后遍历每个索引以生成文件路径。这是代码:

Sub Combine_Text_Files2()

    Dim InputDirPath As String
    InputDirPath = "C:\test\"

    Dim InputFileType As String
    InputFileType = "*.txt"

    Dim OutputDirPath As String
    OutputDirPath = "C:\test\"

    Dim OutputFileName As String
    OutputFileName = "_CombinedOutput.txt"

    Dim InputFileName As String
    InputFileName = Dir$(InputDirPath & InputFileType)

    Dim FileArray() As String
    Dim i As Integer: i = 0

    Do Until InputFileName = vbNullString
        ReDim Preserve FileArray(0 To i)
        FileArray(i) = InputFileName
        InputFileName = Dir$
        i = i + 1
    Loop

    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    Dim Stream As Object
    Set Stream = FSO.CreateTextFile((OutputDirPath & OutputFileName), OverWrite:=True, Unicode:=False)

    Dim FileNameAndPath As String

    For i = LBound(FileArray) To UBound(FileArray)
        FileNameAndPath = (InputDirPath & FileArray(i))
        Debug.Print ("Processing: " & FileNameAndPath)

        Dim fileToCopy As File
        Set fileToCopy = FSO.GetFile(FileNameAndPath)

        Dim streamToCopy As TextStream
        Set streamToCopy = fileToCopy.OpenAsTextStream(ForReading)

        Dim text As String
        text = streamToCopy.ReadAll

        Stream.WriteLine FSO.GetFile(FileNameAndPath).OpenAsTextStream(ForReading).ReadAll
        Debug.Print ("Appended to " & OutputFileName & ": " & FileNameAndPath)
    Next i

    Stream.Close

End Sub

FileNameAndPath 值得到正确更新,并且当它经过第一个 Stream.WriteLine 迭代时,它附加 仅第一个文件的第一个字母 到输出文件,然后继续下一次迭代,在下一次 Stream.WriteLine 由于 Invalid procedure call or argument 而失败。

我已经尝试调试了很长一段时间,但不确定是什么原因造成的。我能想到的唯一可能导致它的是数组,因为它真的是唯一不同的东西 AFAIK...任何帮助将不胜感激!

其他详细信息

如果我注释掉 WriteLine 调用,它会遍历整个数组,立即打印所有文件路径。如您所见,我将原来的一行代码分解为多个步骤进行调试。

复制它很容易:

我发现了问题。问题不在于代码,它工作正常(虽然我确信可以改进,但我会把它交给代码审查)。

问题是一些源文件实际上最初是 Excel 文档,后来被转换为 .txt 并且显然携带了记事本忽略的一些元数据,但是 VBA 编译器不知道如何尝试将其放入 String

吸取教训,对源数据执行健全性检查。