文件输出不符合预期

时间:2018-12-12 16:04:12

标签: vba ms-access access-vba

以下代码段给出了意外的结果,但是很少。它的工作时间约为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应用程序,系统上有很多用户。

写入文件或打开文件时似乎没有任何错误检查代码。

1 个答案:

答案 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。