Web
Analytics

社畜ゲートウェイ

京成・京急を中心に取り上げる阪急ファンのブログです。日本一遅い速報を届けます。

MENU

【スポンサーリンク】

【VB.NET】ファイルに読み取り専用の属性を設定・解除する方法

【スポンサーリンク】

f:id:neko_britannia:20200515220156j:plain

ファイルに読み取り専用の属性を設定もしくは解除する方法です。

ファイルに読み取り専用の属性を設定・解除する方法

ファイルには読み取り専用といった属性があります。ファイルのプロパティを見ると分かると思います。

f:id:neko_britannia:20200613142351j:plain

「読み取り専用(R)」と言うのがプロパティ画面にありますね。読み取り専用属性が付与されている場合、ファイルが編集できなくなります(上書き禁止)。手で読み取り専用にするのはチェックボックスにチェックをつければ良いだけなので簡単ですね。

VB.NETでファイルを読み取り専用にしたり、読み取り専用を解除したりする場合、「System.IO.Fileクラス」のSetAttributesメソッドを使用します。

f:id:neko_britannia:20200613142902j:plain

例として、上図のフォームを作成しました。テキストボックスには読み取り専用を設定したいファイルパスを入れ、実行ボタンを押下すれば、読み取り専用を設定する簡単なフォームを作成しました。

 

ファイルに読み取り専用の属性を設定する

ファイルに読み取り専用の属性を設定する方法は以下のソースコードとなります。

'実行ボタン押下のイベント
Private Sub cmdFileAttributes_Click(sender As Object, e As EventArgs) Handles cmdFileAttributes.Click
    Try
        SetReadOnly()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

'読み取り専用の属性を設定するメソッド
Private Sub SetReadOnly()
    Try
        '対象ファイルの属性をオブジェクト化
        Dim objAttributes As FileAttributes = File.GetAttributes(txtTargetFile.Text)

        '属性が読み取り専用になっていないことを確認(事前確認)
        If (objAttributes And FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then
            MessageBox.Show("ファイルは読み取り専用です。")
            Exit Sub
        Else
            MessageBox.Show("ファイルは読み取り専用ではありません。")
        End If

        '読み取り専用に設定
        File.SetAttributes(txtTargetFile.Text, objAttributes Or FileAttributes.ReadOnly)

    Catch ex As Exception
        Throw
    End Try
End Sub

ボタン押下→読み取り専用を設定するメソッド(SetReadOnly)を呼び出し→読み取り専用設定という流れです。基本的に上記のソースコードをコピペでOKです。実際に読み取り専用を設定している箇所は、SetAttributesメソッドです。

'読み取り専用に設定
File.SetAttributes(txtTargetFile.Text, objAttributes Or FileAttributes.ReadOnly)

第1引数が属性設定したい対象ファイルとなります。ここに、読み取り専用を設定したいファイルのパスを渡してあげます。第2引数は「列挙値のビットごとの組み合わせ。」という何とも小難しいことが書いていますが、気にせずに上記のソースコードの様にして下さい。

 

ファイルの読み取り専用の属性を解除する

ファイルの読み取り専用の属性を解除する方法は以下のソースコードとなります。

'実行ボタン押下のイベント
Private Sub cmdFileAttributes_Click(sender As Object, e As EventArgs) Handles cmdFileAttributes.Click
    Try
        ReleaseReadOnly()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

'読み取り専用の属性を解除するメソッド
Private Sub ReleaseReadOnly()
    Try
        '対象ファイルの属性をオブジェクト化
        Dim objAttributes As FileAttributes = File.GetAttributes(txtTargetFile.Text)

        '属性が読み取り専用になっているか確認(事前確認)
        If (objAttributes And FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then
            MessageBox.Show("ファイルは読み取り専用です。")
        Else
            MessageBox.Show("ファイルは読み取り専用ではありません。")
            Exit Sub
        End If

        '読み取り専用を解除
        File.SetAttributes(txtTargetFile.Text, objAttributes And (Not FileAttributes.ReadOnly))

    Catch ex As Exception
        Throw
    End Try
End Sub

読み取り専用を設定する場合とほぼ同じです。

'読み取り専用を解除
File.SetAttributes(txtTargetFile.Text, objAttributes And (Not FileAttributes.ReadOnly))

SetAttributesメソッドの第2引数が読み取り専用を設定の記述と異なりますが、まあ難しいことは考えずにコピペして使って下さい。

 

ファイルが存在しない場合の実行時エラー対処

上記の例として記載したソースコードですが、動作確認のための例なので、実践で使用する時はファイルの存在チェックは必須となります。試しに、ファイルパスを記載せずに動かしてみます。

f:id:neko_britannia:20200613145601j:plain

そして存在しないファイルパスを入力して実行した場合。

f:id:neko_britannia:20200613145614j:plain

どちらの状態でも、対象ファイルのオブジェクト化で実行時エラーが発生します。そもそもファイルが存在しないですからね。なので、既にあるファイルの属性を設定する時は、ファイルの存在チェックが必須となります。ファイルの存在チェックを含めたソースコードを記載しておきますね。

'実行ボタン押下のイベント
Private Sub cmdFileAttributes_Click(sender As Object, e As EventArgs) Handles cmdFileAttributes.Click
    Try
        SetReadOnly()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

'読み取り専用の属性を設定するメソッド
Private Sub SetReadOnly()
    Try
        'ファイル存在チェック
        If System.IO.File.Exists(txtTargetFile.Text) = True Then
            'ファイルが存在する
            MessageBox.Show("ファイルがあるよ!", "ファイル存在チェック", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        Else
            'ファイルが存在しない
            MessageBox.Show("ファイルがないよ!", "ファイル存在チェック", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End If

        '対象ファイルの属性をオブジェクト化
        Dim objAttributes As FileAttributes = File.GetAttributes(txtTargetFile.Text)

        '属性が読み取り専用になっていないことを確認(事前確認)
        If (objAttributes And FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then
            MessageBox.Show("ファイルは読み取り専用です。")
            Exit Sub
        Else
            MessageBox.Show("ファイルは読み取り専用ではありません。")
        End If

        '読み取り専用に設定
        File.SetAttributes(txtTargetFile.Text, objAttributes Or FileAttributes.ReadOnly)

    Catch ex As Exception
        Throw
    End Try
End Sub

ファイルの存在チェックのタイミングとしては一番最初にするのが必須となります。ファイルが存在しないのにファイルに関する操作を行うことは出来ません(実行時エラーとなる)。

 

編集後記

ファイルの読み取り専用を設定・解除する方法はそんなに難しくはないのですが、SetAttributesメソッドの第1引数は正しいパスが渡されることが前提のため、事前にチェックする必要があります。存在チェックを入れないとバグの温床となりかねないですので、存在チェックの処理を入れておきましょう。

関連記事

「ファイルが存在しない場合の実行時エラー対処」で使用した、ファイルの存在チェックについての記事はコチラです。

www.stellacreate.com

参考サイト

File.SetAttributes(String, FileAttributes) メソッド

docs.microsoft.com