Back to Top

プログラムの覚書

Category: VB.NET

VB.NET

VB.NET ファイルを移動する

ファイルを移動する方法を記載します。

File.Move メソッドを使用する方法

Dim sFilePath As String = "C:\work\myfile.txt"

'ファイルを移動する
System.IO.File.Move(sFilePath, "C:\work2\myfile.txt")

'ファイルを別名で移動する(同一場所だとリネームと同じになる)
System.IO.File.Move(sFilePath, "C:\work\myfile.bak")

※移動先に同一ファイル名が存在するとエラーとなる

以下削除を組み合わせてエラーを回避する方法

Dim sFilePath As String = "C:\work\myfile.txt"
Dim sFilePath2 As String = "C:\work2\myfile.txt"

System.IO.File.Delete(sFilePath2)
System.IO.File.Move(sFilePath, sFilePath2)

※System.IO.File.Deleteメソッドは、ファイルが存在しなくてもエラーにならない。

 

My.Computer.FileSystem.MoveFile メソッドを使用する方法

Dim sFilePath As String = "C:\work\myfile.txt"

'ファイルを移動する
System.IO.File.Move(sFilePath, "C:\work2\myfile.txt")

'既に同じ名前のファイルが存在していても上書きで移動する
My.Computer.FileSystem.MoveFile(sFilePath, "C:\work\myfile.bak", True)

 

FileInfo クラスを使用する方法

Dim sFilePath As String = "C:\work\myfile.txt"

'ファイルを移動する
Dim finfo As New System.IO.FileInfo(sFilePath)
finfo.MoveTo("C:\work\myfile.bak")

 

VB.NET Threadクラスによるマルチスレッド

Threadクラスでマルチスレッドをする

・同時に実行できるスレッドの数に制限がある

Threadのマルチスレッド

Start()         スレッドの開始
Suspend()       スレッドの一時停止
Resume()        スレッドの再開
Join()          スレッドの処理が終了するまで待つ
Abort()         スレッドの強制終了
ThreadState     スレッドのステータスの取得

スレッド使用例

Private thisLock As New Object
Private s As String = ""

「呼ぶ出されるスレッドプログラム」
Private Sub ThreadMain1()
    Dim i As Integer
    For i = 0 To 9999
        SyncLock thisLock
            s = s + "A"
        End SyncLock
    Next
    System.Diagnostics.Debug.WriteLine(" Thread2:" & s.Length.ToString())
End Sub


------------------------------------------------------------------------------

「呼び出し側のプログラム」
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim thread1 As System.Threading.Thread = New System.Threading.Thread(AddressOf ThreadMain1)
    thread1.Start()
    thread1.Join()
End Sub

 

スレッド側でメインのコントロールを更新する

別スレッドからコントロールを操作する場合にはInvokeメソッドを使用します。Invokeメソッドを使うと、コントロールに対する操作をメイン・スレッドで実行させることができる。

Invokeメソッドを使う必要があるかどうかをチェックするためのInvokeRequiredプロパティがあります。このプロパティは、それを呼び出したスレッドがメイン・スレッドかどうかを調べ、trueあるいはfalseを返します。

Private thisLock As New Object
Private s As String = ""

'コントロールを扱うためのデリゲート宣言
Delegate Sub delegate_ProgressBarValue(ByVal value As Integer)

'デリゲート宣言をデータ型とした変数を作成
Private ProgressBarValue As New delegate_ProgressBarValue(AddressOf ProgressBar1Value)

'プログレスバー更新処理
Sub UpdateProgressBar1(val As Integer)
    If InvokeRequired Then
        Dim callback As New delegate_ProgressBarValue(AddressOf UpdateProgressBar1)
        Invoke(callback, val)
        Return
    End If
    ProgressBar1.Value = val
End Sub

Private Sub ThreadMain1()
Dim i As Integer
    For i = 0 To 999
        UpdateProgressBar1(i)
        SyncLock thisLock
            s = s + "A"
        End SyncLock
    Next
    System.Diagnostics.Debug.WriteLine(" Thread1:" & s.Length.ToString())
End Sub

--------------------------------------------------------------------------------------

[呼び出し側プログラム]

Dim Thread1 As System.Threading.Thread = Nothing

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If Not Thread1 Is Nothing Then
        ' スレッドが停止状態でない場合は終了
        If Thread1.ThreadState <> System.Threading.ThreadState.Stopped Then
            Exit Sub
        End If
    End If

    ' スレッド開始
    Thread1 = New Threading.Thread(AddressOf ThreadMain1)
    Thread1.IsBackground = True
    Thread1.Start()
    '    Thread1.Join()
End Sub

'Joinでスレッド終了を待たせると、メインコントロール更新で死にますので注意

Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
    If Not Thread1 Is Nothing Then
        ' スレッドを強制終了させる
        Thread1.Abort()

        ' メインスレッドに結合する
        Thread1.Join()
    End If
End Sub