什么是"文件编号"?

use*_*117 6 c# vb.net vb6

我正在使用之前从VB6转换过的一些C#代码,并且它执行了大量的文件IO.到处都是我看到的:

  fn = VBNET.FileSystem.FreeFile();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

pmc*_*ane 7

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


Mic*_*eld 5

在早期版本的BASIC(对象)中,当您想对文件进行I / O时,需要按其编号告诉解释器您要使用哪个打开的文件。运行时有一个打开文件的表,并且文件号基本上是该表的索引。这个概念类似于文件句柄,就像您通过Windows API使用的一样,但是每个BASIC程序都有自己的文件编号集。

通常,执行文件I / O的方式如下所示:

OPEN #1, "path\to\file"
PRINT #1, "Stuff I want in the file"
CLOSE #1
Run Code Online (Sandbox Code Playgroud)

您将负责跟踪已打开的文件编号,它们指向的文件等。

对于简单的程序来说,这没什么大不了的,但是当您开始编写带有共享子例程和外部库等的模块化程序时,该系统将无法使用。例如,如果要编写日志记录例程,则必须以某种方式为日志文件选择一个文件号,可以保证该文件号永远不会在其他任何地方使用,否则会发生不良情况。

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
Run Code Online (Sandbox Code Playgroud)

FreeFile基本上等效于循环,除了它已经知道使用了哪些文件编号而没有使用,因此它可以给您一个答案。否则,I / O的工作原理将完全相同:拥有免费文件号后,将其打开,对其进行读/写并再次将其关闭。