CreateTextFile 是否会在 OpenTextFile 上创建竞争条件?

Does CreateTextFile create a race condition over OpenTextFile?

我的脚本遍历 .xlsx 文件中的大量数据,并且根据该文件是否存在,creates/opens 一个与当前正在处理的数据集相关的文件。

处理确定 FileSystemObject 是否应该 create/open 文本文件的代码最终导致部分数据在 text[= 的开头重复24=] 文件。一旦更改为使用单个文件,就没有重复,这意味着处理数据提取的逻辑很好。

Set excel = CreateObject("Excel.Application")
Set excelWorkbook = excel.Workbooks.Open("C:\data.xlsx")
Set excelSheet =  excelWorkbook.Worksheets(1)
Set fso = CreateObject("Scripting.FileSystemObject")

id = ""
sum = 0
row = 2

Do While row < 40500
    'identifier located in column c
    id = excelSheet.Range("C" & row).value

    'followed by numbers in column h
    'column h is empty on the row of an id
    Do While Len(excelSheet.Range("H" & row+1).value) > 0 
        sum = excelSheet.Range("H" & row+1).value + sum
        row = row + 1
    Loop

    WriteToText id,row,sum
    sum = 0
    row = row + 1
Loop

Sub WriteToText(x, y, z)
    fileName = "C:\file" & x & ".txt"
    If fso.FileExists(fileName) Then
        Set file = fso.OpenTextFile(fileName, 8)
        file.WriteLine x & " " & y " " & z
        file.Close
    Else  
        Set file = fso.CreateTextFile(fileName)
        file.WriteLine x & " " & y " " & z
        file.Close
    End If
End Sub

这是创建、处理和关闭文本文件后未释放内存 space 的结果吗?

Set file = Nothing

...导致使用 CreateTextFile 创建的缓冲区在调用 OpenTextFile 后在内存中持续存在?

如果不了解数据的来源以及提取方式,就无法判断重复数据的来源。我没有在您的代码中看到固有的竞争条件,因为 VBScript 首先不是 multi-threaded。但是,您可以通过简单地使用 OpenTextFile 方法并将第三个参数设置为 True 来避免任何与区分文件是否已经存在有关的问题。这将自动创建一个丢失的文件并附加到它。

Sub WriteToText(x, y, z)
    fileName = "C:\file" & x & ".txt"
    fso.OpenTextFile(fileName, 8, True).WriteLine x & " " & y " " & z
End Sub

在函数内部将对象设置为 Nothingalmost never required,因为 VBScript 通常会自动处理它。