我正在使用之前从VB6转换过的一些C#代码,它会执行大量的文件I-O。到处都是我看到的:
fn = VBNET.FileSystem.FreeFile();
...后跟 VBNET.FileSystem.FileOpen(),一些文件I-O,然后是 VBNET.FileSystem.FileClose()。
对 FreeFile()的调用会生成一个"文件编号",这是打开文件所必需的。但是什么是文件编号,当你完成它时,如何将其发布回系统?
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.filesystem.freefile.aspx上的文档似乎没有说,但它确实说如果"超过255个文件正在使用"则会抛出异常,这对我来说意味着当我完成它们时,释放它们是个好主意。
NB - 我知道有更好的文件IO库可供使用,但这是我们一直坚持的,直到我们有资源重写这些东西,所以我只想了解它
答案 0 :(得分:6)
这些VB6命令(FreeFile,FileOpen,FileClose,LOF等)至少存在于QBasic之前。我希望文件号最初是MS-DOS文件句柄。
快速谷歌搜索提出了这些链接:
回到QBasic(如果内存服务),FileOpen
命令打开文件并保留文件句柄。 FileClose
命令关闭了文件并释放了句柄。
FreeFile
只是获取未使用文件句柄的便捷方法:如果您知道自己没有(例如)文件#1打开,那么您只需拨打OPEN "C:\DOS\RUN" FOR INPUT AS #1
而不是打电话给FreeFile
。您仍然可以使用CLOSE #1
我无法记住VB6中是否有所改变。正如Hans Passant所提到的,在.NET内部,文件号现在只是VB6File对象数组的索引。 FileSystem.vb
答案 1 :(得分:5)
在BASIC的早期版本中,预对象,当您想要对文件执行I / O时,您需要告诉解释器您想要使用哪个打开文件的编号。运行时有一个打开文件的表,文件号基本上是该表的索引。这个概念类似于文件句柄,就像您通过Windows API使用的那样,但每个BASIC程序都有自己的文件编号。
通常,您执行文件I / O的方式如下:
OPEN #1, "path\to\file"
PRINT #1, "Stuff I want in the file"
CLOSE #1
您将负责跟踪您打开的文件编号,他们指向的文件等等。
对于简单程序,这不是什么大问题,但是当你开始编写模块化程序时,使用共享子程序和外部库等,该系统就变得不可行了。例如,如果您正在编写日志记录例程,则必须以某种方式为日志文件选择一个文件编号,您可以保证该文件编号永远不会在其他任何地方使用,否则会发生错误。
FreeFile
函数是VB对这个问题的回答。调用FreeFile
会返回打开文件列表中的下一个可用插槽,然后您可以确定其他人没有使用。在伪代码中,它就像在上面的代码中这样做:
I = 0
WHILE ALREADYOPEN(#I)
I = I + 1
WEND
OPEN #I, "path\to\file"
PRINT #I, "stuff to go into file"
CLOSE #I
FreeFile
基本上相当于循环,除了它已经知道使用了哪些文件号,哪些不是这样,它只能给你一个答案。否则,I / O的工作原理完全相同:一旦你拥有你的免费文件号,你打开它,读/写它,然后再关闭它。