2014-04-03 96 views
4

我正在从早些时候从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个文件正在使用中”会引发异常,这意味着释放它们会是一个好主意当我完成他们。

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

+0

FreeFile reuturns其可用于IO手柄文件;它类似于流,并且在表面之下可能是文件流的包装。我认为关闭与手柄/编号关联的文件会释放它 – Plutonix

+1

从字面上看,它是一个数字。在0和255之间。在.NET中,它是一个VB6File对象数组的索引。 FileClose()再次释放数字。长期来看,你可能想用FileStream或StreamReader/Writer替换它,但这是很多工作。 –

+1

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.filesystem.freefile(v=vs.80).aspx –

回答

5

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

+0

它看起来像你说得对文件关闭。这是非常不对称的,因为文件关闭是文件打开的关闭。这就像有两个左括号,然后是一个右括号,这是一种超级括号,可以关闭两个开放的父本。不管怎样,谢谢! – user316117

+1

@ user316117如果没记错,早在QBasic中,的FileOpen是实际保留的文件句柄,并FILECLOSE就是释放文件句柄。 FreeFile只是一个方便的功能,用于获取尚未打开的文件句柄。所以对称性是FileOpen打开文件句柄,FileClose关闭它。我会澄清我的答案。 – pmcoltrane

+1

@ user316117 FreeFile实际上并没有对文件做任何事情。你可以重复地调用它,你会得到相同的值,直到你真正打开文件。 –

3

在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的工作原理完全一样:一旦你免费的文件编号,你打开它,读/写,然后再次关闭它。

+0

+1为背景信息... – Joe

+0

但它如何获得发布?一旦系统或运行时给了我一个文件编号,它是如何知道我什么时候完成的?正如我在我的问题中所说的那样,这个软件会执行大量文件I-O,所以如果最大值为255,那么如果没有办法告诉系统何时完成文件编号,我很容易想象它会耗尽。 – user316117

+0

这就是CLOSE/FileClose所做的。一旦你关闭了一个文件号,你就不能再使用它了,并且可以在新的OPEN语句中再次使用它。 –