VB随机访问数据文件

VB随机访问数据文件

本文介绍了VB随机访问数据文件:关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的某些RA数据文件保持挂起状态打开".我还找不到这是怎么回事,我也不知道文件号是什么

有没有一种方法可以使用My.Computer.FileSystem方法关闭"文件?

Some of my RA datafiles remain hung "open". I have not been able to find how this is happening yet and I don''t know what the file number is

Is there a way to absolutley "close" a file using a My.Computer.FileSystem method?

Is there a way to determine what the file number is for a given data file?

推荐答案


Imports System.Text

   Public Function FnLStr(ByVal a As String, ByVal i As Integer, Optional ByVal s As Integer = 32) As String
      If a Is Nothing Then a = ""
      Return a.PadRight(i, Chr(s))
   End Function

   Public Function Encode(ByVal bt() As Byte, ByVal bg As Integer, ByVal s As String, ByVal len As Integer) As Byte()
      s = FnLStr(s, len)
      Dim unicode As Encoding = Encoding.Unicode
      Dim b() As Byte = unicode.GetBytes(s)
      For i = 0 To len * 2 - 1
         bt(bg + i) = b(i)
      Next
      Return bt
   End Function

   Public Function Decode(ByVal bt() As Byte, ByVal bg As Integer, ByVal len As Integer) As String
      Dim ea As Encoding = Encoding.ASCII
      Dim eu As Encoding = Encoding.Unicode
      Dim b(len * 2 - 1) As Byte
      For i = 0 To len * 2 - 1
         b(i) = bt(i + bg)
      Next
      b = Encoding.Convert(eu, ea, b)
      For i = 0 To UBound(b)
         If b(i) = 0 Then b(i) = 32
      Next
      Dim a(ea.GetCharCount(b, 0, b.Length) - 1) As Char
      ea.GetChars(b, 0, b.Length, a, 0)
      Return New String(a).Trim
   End Function



如您所见,您需要两倍的字符来存储Unicode



as you can see, you need twice as many characters to store Unicode


Public Class MyClass
 Private bt(1234) As Byte
#Region " Properties "
   Public Property Bytes() As Byte()
      Get
         Return bt
      End Get
      Set(ByVal value As Byte())
         bt = value
      End Set
   End Property
   Public Property Access() As Integer
      Get
         Return bt(0)
      End Get
      Set(ByVal Value As Integer)
         bt(0) = CByte(Value)
      End Set
   End Property
   Public Property ChargeExpenses() As Byte
      Get
         Return bt(1)
      End Get
      Set(ByVal value As Byte)
         bt(1) = value
      End Set
   End Property
   Public Property ChargeExpensesValue() As Integer
      Get
         Return bt(2) + bt(3) * cn256
      End Get
      Set(ByVal value As Integer)
         bt(3) = CByte(value \ cn256)
         bt(2) = CByte(value - bt(3) * cn256)
      End Set
   End Property
   Public Property ChargeVat() As Boolean
      Get
         Return bt(7) = 1
      End Get
      Set(ByVal value As Boolean)
         If value Then bt(7) = 1 Else bt(7) = 0
      End Set
   End Property
   Public Property Cost() As Double
      Get
         Return FnBytesToReal(bt, 8) ' my own conversion function
      End Get
      Set(ByVal Value As Double)
         bt = FnRealToBytes(bt, 8, Value)
      End Set
   End Property
   Public Property Created() As String
      Get
         Dim a As String
         Try
            a = New Date(bt(20) + l_Times.BaseYear, bt(19), bt(18)).ToShortDateString
         Catch ex As Exception
            Try
               a = New Date(bt(18) + l_Times.BaseYear, bt(19), bt(20)).ToShortDateString
            Catch ex1 As Exception
               a = ""
            End Try
            a = ""
         End Try
         If a = "" Then Return CStr(Today) Else Return a
      End Get
      Set(ByVal Value As String)
         Dim v As Date = CDate(Value)
         bt(18) = CByte(v.Day)
         bt(19) = CByte(v.Month)
         bt(20) = CByte(v.Year - l_Times.BaseYear)
      End Set
   End Property
    Public Property Description(ByVal Index As Integer) As String
      Get
         Dim k As Integer
         Select Case Index
            Case 0 : k = 163
            Case 1 : k = 227
            Case 2 : k = 291
            Case 3 : k = 355
         End Select
         Dim a As String = Decode(bt, k, 32)
         Return a.Trim
      End Get
      Set(ByVal value As String)
         Dim k As Integer
         Select Case Index
            Case 0 : k = 163
            Case 1 : k = 227
            Case 2 : k = 291
            Case 3 : k = 355
         End Select
         bt = Encode(bt, k, value, 32)
      End Set
   End Property 

现在,您需要读取文件并将其放入此类.
从类RandomFile开始

Now you need to read the file and put it into this class.
Start with class RandomFile

#Region " Read File "
   Public Function OpenReader() As e_ioRead '' my enum
      If File.Exists(fpath) Then '' fPath setup in New
         Dim r As Integer
         Do
            Try
               r += 1
               fs = New FileStream(fpath, FileMode.Open, FileAccess.Read, FileShare.None)
               Exit Do
            Catch ex As Exception
               If r > 256 Then Return e_ioRead.Lock
            End Try
         Loop
         sr = New BinaryReader(fs)
         Return e_ioRead.OK
      Else
         Return e_ioRead.Err
      End If
   End Function
   Public Function ReadBytes(ByVal Record As Integer) As Byte()
      Try
         fs.Seek(LineWidth * Record + hk, SeekOrigin.Begin) '' linewidth is width of record x2 if using Encoding
         Dim b() As Byte = sr.ReadBytes(LineWidth)
         Return b
      Catch ex As Exception
         Return Nothing
      End Try
   End Function
   Public Sub CloseReader()
      sr.Close()
      fs.Close()
      fs.Dispose()
   End Sub
#End Region

现在其他地方有这样的东西:-

Now somewhere else have something like this:-

Private Function OpenforRead(ByVal path As String) As Boolean
   mfs = New RandomFile(path)
   Select Case mfs.OpenReader(-1)
      Case e_ioRead.OK
         K = mfs.Count
         Return True
      Case e_ioRead.Lock
         MsgBox(path & " is locked!")
      Case Else
         K = -1
         Return False
   End Select
End Function


Public Function Read() As MyClass
      If OpenforRead() Then
         With mfs
            Try
               CurrentJd = New MyClass
               CurrentJd.Bytes = .ReadBytes(cJob)
            Catch ex As Exception
               MsgBox(ex.Message)
            End Try
            .CloseReader()
         End With
      End If
      Return CurrentJd
   End Function


希望你有主意


Hope you get the idea


这篇关于VB随机访问数据文件:关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-11 18:59