以干净的VB.NET方式随机访问文件

时间:2013-10-08 12:15:14

标签: vb.net

在VB.NET中工作一段时间后,我想摆脱Microsoft.VisualBasic依赖 由于文本文件和字符串操作在这里很容易,我不知道该怎么做。

是否可以在VB.NET中编写等效代码而不使用Microsoft.VisualBasic命名空间以及此代码的外观如何?

Dim fnum As Integer = FreeFile()
FileOpen(fnum, "Setup\myadmin", OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Shared, Len(idstruct))
FilePut(fnum, idstruct, 1) 'structure data to file in record 1
FileClose(fnum)

4 个答案:

答案 0 :(得分:2)

尽管我同情你希望删除对Microsoft.VisualBasic命名空间的所有引用,并且尽管我认为这样做有价值,但有时它不值得麻烦。命名空间确实包含一些有用的工具,没有它就不容易复制。

例如,我会想到TextFieldParser。它允许您轻松读取CSV和固定宽度的文件。在.NET框架中没有类似的其他类。那么,重新发明轮子是否值得你不引用Microsoft.VisualBasic命名空间?我认为这不值得。

虽然可以使用FileGetFilePutFileStreamStreamReader重现StreamWriterBinaryReader的行为,和BinaryWriter课程,可能不值得一切麻烦。 FileGetFilePut方法专门针对向后兼容性提供,因此,如果与旧系统的兼容性是您的目标,那么使用FileGet和{{1是一个合适的解决方案。

但是,这些建议中的一些取决于数据类型。例如,如果结构只包含固定宽度的字符串,那么使用FilePutStreamReaderStreamWriter很容易复制。或者,如果它只包含整数,那么使用TextFieldParserBinaryReader可能很容易重现。

但是,即使您可以使用其他非VB专用类轻松地重现逻辑,这样做也无法获得任何好处。事实上,您的代码将更复杂,并且自我记录会更少。当您使用BinaryWriterFileGet查看代码时,不仅可以轻松判断正在执行的操作,而且显而易见的是它是为了向后兼容。如果用自己的逻辑替换它们,那么在不向代码添加注释的情况下,向后兼容性的必要性就不那么明显了。

如果您不喜欢看它们,我当然可以理解,可能值得将它们包装在包装类中。例如,您可以使用加载/保存方法创建数据访问样式类,该方法在内部仅使用FilePutFileGet。无论如何,这样做是好的做法。这样,如果您选择以不同的格式或不同的数据源(例如数据库)存储数据,您可以在一个类中更改它而无需重写所有代码。

答案 1 :(得分:1)

我刚发现的另一件事就是这个关于My.Computer.FileSystem的MSDN页面:

http://msdn.microsoft.com/en-us/library/0b485hf7%28v=vs.90%29.aspx

我发现的

是从FilePut上的MSDN页面引用的:

http://msdn.microsoft.com/en-us/library/0s9sa1ab%28v=vs.90%29.aspx

来自帖子like this one我的理解是,它只是System.IO的包装器,但它应该为底层IO功能提供“更方便,更易理解”的接口。

答案 2 :(得分:0)

如果您指的是使用LEN()函数(这是我唯一可以看到引用Microsoft.VisualBasic命名空间的东西,除非我遗漏了某些内容),那么您可以使用String.Length代替。例如。 idstruct.Length,假设idstruct是一个String。

答案 3 :(得分:0)

看看System.IO.FileStream。方法略有不同,但很简单。

 Dim fs As New FileStream(mUserFile, FileMode.XXX, FileAccess.XXX)

或:

 Using fs as New FileStream....

 End Using

要改变的主要事情是,不是编写结构,而是将其转换为字节数组(Count将是数组的长度,在您的示例中偏移0):

 fs.Write(byt(), lOffset, lCount)

你可以将它全部包装在一个类中,以模拟旧的随机访问文件方法,如果有很多遗留代码需要支持的话。还有一个BinaryReaderBinaryWriter,如果数据很大但是大部分是静态的,你也可以查看序列化。