
ファイルに読み取り専用の属性を設定もしくは解除する方法です。
ファイルに読み取り専用の属性を設定・解除する方法
ファイルには読み取り専用といった属性があります。ファイルのプロパティを見ると分かると思います。

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

例として、上図のフォームを作成しました。テキストボックスには読み取り専用を設定したいファイルパスを入れ、実行ボタンを押下すれば、読み取り専用を設定する簡単なフォームを作成しました。
ファイルに読み取り専用の属性を設定する
ファイルに読み取り専用の属性を設定する方法は以下のソースコードとなります。
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引数が読み取り専用を設定の記述と異なりますが、まあ難しいことは考えずにコピペして使って下さい。
ファイルが存在しない場合の実行時エラー対処
上記の例として記載したソースコードですが、動作確認のための例なので、実践で使用する時はファイルの存在チェックは必須となります。試しに、ファイルパスを記載せずに動かしてみます。

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

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