在 VB6 中,如何访问 FileSystem.GetFileInfo()?
Posted
技术标签:
【中文标题】在 VB6 中,如何访问 FileSystem.GetFileInfo()?【英文标题】:In VB6, how to access FileSystem.GetFileInfo()? 【发布时间】:2018-08-17 15:33:16 【问题描述】:旧项目的回溯,需要使用 VB6。我在引用旧 VB6 IDE 中包含 System.IO 的适当 DLL 时遇到问题。
我已尝试引用:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll - 错误:无法添加对指定文件的引用
添加了对 C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb 的引用 - 不起作用。
添加了对 C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.tlb 的引用 - 没有来自智能感知的 System.IO。
有人可以发布分步说明吗?
【问题讨论】:
你不能。框架类不公开 COM 接口。你可以使用包含的 VB6 文件系统对象和接口,或者调用 Win api,或者如果你真的想使用框架类,你需要编写一个(小?).net 应用程序来公开一个 COM 互操作,调用它来自您的 VB6 应用程序,然后代表您的 VB6 应用程序在其中进行框架调用。 那么我如何获得磁盘空间空闲/已用方法的访问权限? 或者我想使用 My.Computer.FileSystem... 无法找到引用这个/ .NET 框架中没有可以直接使用的东西。 VB6 在任何方面都不是基于 .NET,而且比它早了很多年。 【参考方案1】:得到这个有点工作:
Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) As Long
Dim info As DiskInformation
Dim lAnswer As Long
Dim lpRootPathName As String
Dim lpSectorsPerCluster As Long
Dim lpBytesPerSector As Long
Dim lpNumberOfFreeClusters As Long
Dim lpTotalNumberOfClusters As Long
Dim lBytesPerCluster As Long
Dim lNumFreeBytes As Double
Dim dPercentFreeClusters As Double
Dim sString As String
lpRootPathName = "c:\"
lAnswer = GetDiskFreeSpace(lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters)
lBytesPerCluster = lpSectorsPerCluster * lpBytesPerSector
' Throws overflow exception - I guess there were no Terabyte drives when VB6 came around
' lNumFreeBytes = lBytesPerCluster * lpNumberOfFreeClusters
'sString = "Number of Free Bytes : " & lNumFreeBytes & vbCr & vbLf
'sString = sString & "Number of Free Kilobytes: " & (lNumFreeBytes / 1024) & "K" & vbCr & vbLf
'sString = sString & "Number of Free Megabytes: " & Format(((lNumFreeBytes / 1024) / 1024), "0.00") & "MB"
dPercentFreeClusters = Round(lpNumberOfFreeClusters / lpTotalNumberOfClusters * 100, 2)
但是,在尝试计算空闲字节数时会引发 Overflow
异常。
我想与My.Computer.FileSystem
一起工作。有什么建议吗?
【讨论】:
VB6 long 是 32 位有符号数量(最大值为 2^31-1)。即使您将此结果分配给 Double,也会在将两个 long 相乘时发生溢出。您需要使用浮点变量(双精度或单精度)进行计算以避免这种情况,即:Dim lBytesPerCluster As Double 和 Dim lpNumberOfFreeClusters As Double。或者,如果需要固定的十进制数量,您可能会使用 Decimal 变量而不是 Double (当然,当值变得足够大时,浮点数会丢弃最低有效位)。 更正我上面的评论 - 当然,VB6 没有 Decimal 变量类型。我应该说,并且打算说,使用 Currency 变量类型。以上是关于在 VB6 中,如何访问 FileSystem.GetFileInfo()?的主要内容,如果未能解决你的问题,请参考以下文章