DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ランダムファイルアクセスやっております。

環境/言語:[VB.NET 2010]
分類:[.NET]

ランダムファイルのサンプルを作りたく模索しております。

vb.net 2010で作るのですが、
下記のサンプルはおそらくバージョンの古いコードかと思われ
2010仕様への修正に悩んでいます。

参考になるサイトやアドバイスありましたらお願いします。


'住所録データの構造体
Private Type Addressdat
  'この場合の 14 はVB上では14文字分で保存時は
  'LenB(StrConv(Text2.Text, vbFromUnicode)) で 14バイト分です。
  'VB上では全角文字で14文字ですが保存は7文字までしか保存出来ません。
  FullName As String * 14     '氏名      Text2
  TelNo  As String * 12     '電話番号   Text3
  PostNo  As String * 8     '郵便番号   Text4
  Address As String * 40     '住所      Text5
End Type

'使用変数の宣言
Private Add     As Addressdat 'Addressdat をAddに代入
Private lngRCNo   As Long    '指定のレコードNo
Private lngRCMax   As Long    '登録件数のMAX
Private intAddFileNo As Integer   '使用可能なファイルNo


Private Sub sDataOpen()
'データーのOpen処理
  intAddFileNo = FreeFile   '使用可能なファイルNoを取得
  'カレントディレクトリからデーターファイル
  'Address.DAT をオープンします
  Open App.Path & "\Address.dat" For Random As #intAddFileNo Len = Len(Add)
  '登録件数のMaxを取得します
  lngRCMax = LOF(intAddFileNo) \ Len(Add)
End Sub


Private Sub sAddressShow()
'データの表示
  Call sDataOpen   'ファイルをオープン
  '指定レコードのデーターを表示
  'レコードNOのエラー防止
  If lngRCNo = 0 Then lngRCNo = 1
  '指定のレコードを開く
  Get #intAddFileNo, lngRCNo, Add
  With Add
    Text2.Text = .FullName   '氏名      Text2
    Text3.Text = .TelNo     '電話番号   Text3
    Text4.Text = .PostNo    '郵便番号   Text4
    Text5.Text = .Address    '住所      Text5
  End With
  '一旦ファイルを閉じる(すぐ開く必要がなければ)
  Close #intAddFileNo
End Sub


Private Sub sWrite()
'データの書込み処理
  Call sDataOpen
  Get #intAddFileNo, lngRCNo, Add
    '指定のレコードのデータを構造体の代入
  With Add
    '保存される時は LenB(StrConv(Text2.Text, vbFromUnicode)) で 14バイト
    '分しか保存できません。VB上で表示する場合は14文字です。
    .FullName = Text2.Text   '氏名      Text2
    .TelNo = Text3.Text     '電話番号   Text3
    .PostNo = Text4.Text    '郵便番号    Text4
    .Address = Text5.Text    '住所       Text5
  End With
  'ファイルに書込み保存
  Put #intAddFileNo, lngRCNo, Add
  '登録件数のMaxを再取得します
  lngRCMax = LOF(intAddFileNo) \ Len(Add)
  Close #intAddFileNo
  Call sAddressShow       '結果を再表示
End Sub


'起動時の処理
Private Sub Form_Load()
  lngRCNo = 1
  sAddressShow
End Sub


Private Sub Text1_LostFocus()
'指定のレコードNoを取得
  On Error Resume Next
  lngRCNo = CLng(Text1.Text)
  If Err.Number Then
    Beep
    Err.Clear
    Text1.SetFocus
    Exit Sub
  End If
  If lngRCNo > lngRCMax Then
    Beep
    Text1.SetFocus
    Exit Sub
  End If
  sAddressShow
End Sub


Private Sub Command2_Click()
'新規作成
  lngRCNo = lngRCMax + 1
  Text1.Text = lngRCNo
  sAddressShow
End Sub


Private Sub Command1_Click()
'書込み処理へ
  Call sWrite
End Sub
■No32257に返信(ak47さんの記事)
> ランダムファイルのサンプルを作りたく模索しております。
>
> vb.net 2010で作るのですが、
> 下記のサンプルはおそらくバージョンの古いコードかと思われ
> 2010仕様への修正に悩んでいます。
>
> 参考になるサイトやアドバイスありましたらお願いします。
>
アドバイス: VB2008 以降のサンプルをお探し下さい。
参考になるサイト:このサイトの 「.NET プログラミング Tips」
■No32258に返信(しまさんの記事)

了解しました。
試行錯誤してみます。

ありがとうございます。
2014/04/16(Wed) 14:06:07 編集(投稿者)

■No32261に返信(ak47さんの記事)

エラーチェックなしですがサンプルです。
Button1=>新規保存
Button2=>既存上書き
Button3=>読込

RecLengthがレコード長なので適宜変更して下さい。

Imports System.IO
Imports System.Text

Public Class Form1
    Private Const RecLength As Integer = 100

    Private Sub ReadRecord()
        Dim RecNo = CInt(TextBox1.Text)
        Using rd As New BinaryReader(File.OpenRead("C:\temp\Address.Dat"))
            rd.BaseStream.Seek((RecNo - 1) * RecLength, SeekOrigin.Begin)
            Dim BytRecord() As Byte = rd.ReadBytes(RecLength)
            Using rd2 As New BinaryReader(New MemoryStream(BytRecord), Encoding.UTF8)
                TextBox2.Text = rd2.ReadString
                TextBox3.Text = rd2.ReadString
                TextBox4.Text = rd2.ReadString
                TextBox5.Text = rd2.ReadString
                rd2.Close()
            End Using
            rd.Close()
        End Using
    End Sub

    Private Sub WriteNew()
        Using wt As New BinaryWriter(File.Open("C:\temp\Address.Dat", FileMode.Append))
            Dim BytRecord(RecLength - 1) As Byte
            Using wt2 As New BinaryWriter(New MemoryStream(BytRecord), Encoding.UTF8)
                wt2.Write(TextBox2.Text)
                wt2.Write(TextBox3.Text)
                wt2.Write(TextBox4.Text)
                wt2.Write(TextBox5.Text)
                wt2.Close()
            End Using
            wt.Write(BytRecord)
            wt.Close()
        End Using
    End Sub

    Private Sub UpdateRecord()
        Dim RecNo = CInt(TextBox1.Text)
        Using wt As New BinaryWriter(File.OpenWrite("C:\temp\Address.Dat"))
            wt.Seek((RecNo - 1) * RecLength, SeekOrigin.Begin)
            Dim BytRecord(RecLength-1) As Byte
            Using wt2 As New BinaryWriter(New MemoryStream(BytRecord), Encoding.UTF8)
                wt2.Write(TextBox2.Text)
                wt2.Write(TextBox3.Text)
                wt2.Write(TextBox4.Text)
                wt2.Write(TextBox5.Text)
                wt2.Close()
            End Using
            wt.Write(BytRecord)
            wt.Close()
        End Using
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        WriteNew()
    End Sub

    Private Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click
        UpdateRecord()
    End Sub

    Private Sub Button3_Click(sender As Object, e As System.EventArgs) Handles Button3.Click
        ReadRecord()
    End Sub
End Class
No32257 の投稿はマルチポストです。もし元記事の投稿者にマルチポストの心当たりがない場合は、すぐに返信でお知らせください。

●マルチポストされている場所
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=11252&page=0

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

●書き込みのルールについて
http://dobon.net/vb/bbs/index.html
No32257 の投稿はマルチポストです。ただしマルチポストされた投稿は、元記事の投稿者とは別人が嫌がらせで行なった可能性が高いです。もしそうであれば、すぐに返信でお知らせください。

●マルチポストされている場所
http://bbs.wankuma.com/index.cgi?mode=al2&namber=70744

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

●書き込みのルールについて
http://dobon.net/vb/bbs/index.html

DOBON.NET | プログラミング道 | プログラミング掲示板