【问题标题】:Open old VB6 Random Access File using C#使用 C# 打开旧的 VB6 随机访问文件
【发布时间】:2019-02-12 11:47:20
【问题描述】:

我正在尝试打开使用随机访问创建的旧 VB6 文件。

使用的类型如下:

Type CDB
    dateCreated As Date
    lastModified As Date
    companyName As String * 30
    ownerName As String * 30
    contactName As String * 30
    addresss As String * 100
    tel As String * 75
    vat As String * 8
    BRegd As String * 9
End Type

访问如下:

Dim CDB As CDB
Open "CLIENTS.DAT" For Random As #1 Len = Len(CDB)
Lastrec = LOF(1) / Len(CDB)

For rec = 1 To Lastrec
    Get #1, rec, CDB
    txtDateCreated.Text = Format(CDB.dateCreated, "dd/mm/yyyy")
    txtLastModified.Text = Format(CDB.lastModified, "dd/mm/yyyy")
    txtCompanyName.Text = Trim(CDB.companyName)
    ... and so on
Next

现在我想使用 C# 打开这个文件并将所有数据导入 SQL 数据表中。 谁能帮我使用 Type CDB 作为结构打开这个文件?

【问题讨论】:

  • 内容是什么样的?是二进制的吗?是文字吗?如果文本是什么编码? ...
  • 编写一些将文件内容转换为 JSON 内容的 VB6 代码是否可行?还是 XML?还是需要直接使用文件?
  • 该代码应该可以直接翻译成 C# - 它并不十分复杂。注意 VB 的“日期”信息与 .NET 的“日期时间”不同吗?
  • “旧”样式文件 IO 被“隐藏”在“Microsoft.VisualBasic....”程序集中之一(工作得非常好,包括处理文件大小 > 4gb ... )

标签: c# vb6 randomaccessfile


【解决方案1】:

要使用我的示例,您需要为 Microsoft.VisualBasic.Filesystem 程序集创建一个别名:

Imports VB6FileSystem = Microsoft.VisualBasic.FileSystem
Imports VB = Microsoft.VisualBasic

然后在你的代码中:

// make sure the read buffer is big enough
string testReadData = "".PadRight(128);
int filenumber = VB6FileSystem.FreeFile();
VB6FileSystem.FileOpen(filenumber, @"c:\temp\test.dat", VB.OpenMode.Random,  RecordLength: 128);

// Write some test data ....
VB6FileSystem.FilePut(filenumber, "Testdaten 1", 1, true);
VB6FileSystem.FilePut(filenumber, "Testdaten 4", 4, true);
VB6FileSystem.FilePut(filenumber, "Testdaten 14", 14, true);
// Read some data ...
VB6FileSystem.FileGet(filenumber, ref testReadData, 14, true);
VB6FileSystem.FileClose(filenumber);

当然你必须分析旧的记录结构(vb6 知道“固定长度字符串”,而 C# 不知道它们......)以及数据在文件中是如何表示的。也许您应该在 c# 中读取字节数组,“手动”处理二进制数据(如日期、数字……)。

我没有尝试的是使用字节数组作为引用变量的 FileGetObject 方法。随意完成任务。

【讨论】:

  • 我试过你上面的代码是徒劳的。 C# 仅使用“使用 ...”而不使用 Imports。在 Microsoft.VisualBasic 命名空间下也没有 FileSystem。这是 VStudio 2017。
  • 我强烈建议避免对“新”软件的任何 VB6 的任何依赖。对我来说,这看起来像是数据转换项目的工作。
  • @Fildor:这不是真正的 VB6,它的 .NET(但隐藏在“Microsoft.VisualBasic.*”命名空间中。
  • 我知道这一点。不过,我会考虑将该命名空间作为 very 在 C# 项目中的不洁行为导入。
  • 已在我的解决方案中添加了一个新的 Visual Basic 项目,我可以在其中使用该示例。谢谢!
猜你喜欢
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
相关资源
最近更新 更多