我工作在一些 C # code,早些时候已经从 VB6 转换过来,它做了很多文件 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 库使用,但这是我们坚持,直到我们有资源来重写这个东西,所以我只是想了解它。
这些 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 对象数组的索引。FileSystem.vb
这个概念类似于文件句柄,你可以通过 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 的工作原理完全相同:一旦你有你的自由文件号,你打开它,读 / 写它,然后再次关闭它。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(4条)