究竟什么是“文件编号”

本文关键字:编号 文件编号 文件 什么 究竟 | 更新日期: 2023-09-27 17:56:33

我正在使用一些先前从VB6转换过来的C#代码,它执行了很多文件I-O。 我到处都看到这个:

  fn = VBNET.FileSystem.FreeFile();

。其次是VBNET。FileSystem.FileOpen(),一些文件 I-O,然后是 VBNET。文件系统.文件关闭() .

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

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.filesystem.freefile.aspx 的文档似乎没有说,但它确实说如果"使用的文件超过 255 个",则会引发异常,这对我来说意味着当我完成它们时发布它们是个好主意。

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

究竟什么是“文件编号”

那些VB6命令(FreeFile,FileOpen,FileClose,LOF等)至少早在QBasic就存在了。我希望文件编号最初是MS-DOS文件句柄。

快速的谷歌搜索得出了这些链接:

  • http://support.microsoft.com/kb/269030 - MS-DOS 中的最大文件句柄为 255,这可能解释了该限制。(不是页面的主题,而是我找到的第一个链接。
  • http://stanislavs.org/helppc/file_handles.html - 列出的 INT21 函数似乎与旧样式文件命令匹配。

回到 QBasic(如果没记错的话),FileOpen 命令打开文件并保留文件句柄。FileClose命令关闭文件并释放句柄。

FreeFile只是获取未使用的文件句柄的一种方便方法:如果您知道没有打开(例如)文件 #1,那么您可以只调用OPEN "C:'DOS'RUN" FOR INPUT AS #1而不必打扰调用FreeFile。您仍然会用CLOSE #1关闭它

我不记得在 VB6 中是否发生了变化。正如Hans Passant所提到的,在.NET内部,文件编号现在只是VB6File对象数组的索引。文件系统.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 的工作方式完全相同:一旦您拥有可用文件号,您就可以打开它,读取/写入它,然后再次关闭它。