究竟什么是“文件编号”?

我正在使用一些早先从VB6转换过来的C#代码,它会执行大量的文件IO。 到处都是我看到的:

fn = VBNET.FileSystem.FreeFile(); 

…接下来是VBNET.FileSystem.FileOpen() ,一些文件IO,然后是VBNET.FileSystem.FileClose()

FreeFile()的调用会生成一个“文件号”,这是打开文件所必需的。 但是什么是文件编号,如何在完成后将其释放回系统?

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.filesystem.freefile.aspx上的文档似乎没有说,但它确实说如果“超过255则会抛出exception文件正在使用中“,这对我来说意味着当我完成它们时释放它们是个好主意。

注意 – 我知道有更好的文件IO库可供使用,但这是我们一直坚持的,直到我们有资源重写这些东西,所以我只是想了解它。

那些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

在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的工作原理完全相同:一旦有了自由文件编号,就可以打开它,读/写它,然后再次关闭它。