以下代码段给出了意外的结果,但是很少。它的工作时间约为99%。它应该输出一个XML文件。
Open XMLPath & dblFoo & ".xml" For Output As #15
Print #15, "<?xml version=" & Q & "1.0" & Q & " encoding=" & Q & "utf-8" & Q & "?>"
Print #15, "<main>"
Print #15, "<general>"
Print #15, "<foo>BAR</foo>"
Print #15, "</general>"
Print #15, "<foobar_entry>"
Print #15, "<bar_name>" & Replace(dblFoo, ".", "_") & "_" & someOtherVal & "_F0" & "</bar_name>"
`
` some more tag printing
`
Print #15, "</foobar_entry>"
Print #15, "</main>"
Close #15
现在,输出XML文件的“不良部分”将如下所示:
</general>
try>
... rest of file looks normal
在这种情况下,<foobar_entry>
的第一部分已被切除。
它将显示的另一个错误是:
</main>
NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL
其中NUL是ASCII代码0。
是否可以将垃圾数据输出到文件中以移动文件中的当前读写位置?
这是两个人同时调用函数的问题吗?毕竟,它是一个Access应用程序,系统上有很多用户。
写入文件或打开文件时似乎没有任何错误检查代码。
答案 0 :(得分:3)
如果您要在文件中可靠输出,我强烈建议不要使用Print
。众所周知,Access的文本模式打印会造成麻烦,因为它包含许多逻辑,例如连接变量和将非文本变量写入CSV。
相反,使用二进制写入来控制实际写入文件的内容。
Open XMLPath & dblFoo & ".xml" For Binary Access Write As #15
Put #15, , "<?xml version=" & Q & "1.0" & Q & " encoding=" & Q & "utf-8" & Q & "?>" & vbCrLf
Put #15, ,"<main>" & vbCrLf
'Etc
Close #15
还要注意,这是低级文件IO,这意味着每个写语句都将发送到磁盘而不进行缓冲。我强烈建议一次编写整个字符串,而不要使用大量的少量Print
/ Put
语句。否则,性能会受到影响,尤其是在网络驱动器上。
请注意,您在XML文件中指定了 encoding = utf-8 ,但是,如果您以这种方式将其写入文件,则肯定不会将其编码为UTF-8。