究竟是什么"文件编号"?

时间:2014-04-03 19:29:41

标签: c# vb.net vb6

我正在使用之前从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库可供使用,但这是我们一直坚持的,直到我们有资源重写这些东西,所以我只想了解它

2 个答案:

答案 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的工作原理完全相同:一旦你拥有你的免费文件号,你打开它,读/写它,然后再关闭它。