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

时间:2017-01-15 15:33:17

标签: file-io vbscript text-files filesystemobject

我的脚本遍历.xlsx文件中的大量数据,并且根据文件是否存在,创建/打开与当前正在处理的数据集相关的文件。

确定FileSystemObject是否应该创建/打开文本文件的代码最终会导致部分数据在 text 文件的开头重复出现。一旦改为使用单个文件就没有重复意味着处理数据提取的逻辑很好。

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

这是在创建,处理和关闭文本文件后没有释放内存空间的结果吗?

Set file = Nothing

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

1 个答案:

答案 0 :(得分:2)

如果没有看到您的数据来自哪里以及如何将数据拉到那里,就无法确定重复数据的来源。我没有在代码中看到固有的竞争条件,因为VBScript首先不是多线程的。但是,您可以通过简单地使用OpenTextFile方法并将第三个参数设置为True来避免与文件是否已存在有关的任何问题。这将自动创建一个丢失的文件,否则附加到它。

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

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