読み取り専用のファイル
ファイルのプロパティの設定で読み取り専用の設定を行うことが出来ます。
読み取り専用のファイルを書き込みモードのOpenメソッドで開こうとするとエラーになります。
そのエラーを回避するために、事前に読み取り専用かどうかを調べる方法を紹介します。
ネットワークドライブの読み取り専用ファイルの注意点
上にも書きましたが、読み取り専用ファイルを書き込みモードでOpenしようとするとエラーになります。
ところが、これはローカルディスクにあるファイルの話であり、ネットワークドライブにある読み取り専用ファイルの書き込みOpenはエラーになりません。
そしてなんと、Openが正常のためかPrintメソッドで書き込みできてしまいます。私もこれに気が付いたときには驚きました。読み取り専用の意味ないじゃん、と。
少ししか調べてませんが、どういう理屈なのかは結局分かっていません。
いずれにしても、読み取り専用+Openメソッド=エラー、という認識はやめておいた方がいいと思われます。
ファイルの属性を調べて読み取り専用かどうか判定する
GtAttr関数を使うとファイルの属性を取得することが出来ます。
その属性はVbFileAttribute列挙型の定数で、以下の種類があります。
VbFileAttribute列挙型
定数 | 値 | 内容 |
---|---|---|
vbNormal | 0 | 通常ファイル |
vbReadOnly | 1 | 読み取り専用ファイル |
vbHidden | 2 | 隠しファイル |
vbSystem | 4 | システムファイル |
vbVolume | 8 | ボリュームファイル(使いません) |
vbDirectory | 16 | フォルダ |
vbArchive | 32 | アーカイブ |
vbAlias | 64 | エイリアス(Macのみ。Windowsのショートカット) |
GetAttr関数については「ファイルやフォルダの属性を調べる(GetAttr)」をご参照ください。
読み取り専用かどうかの判定関数
以下は引数のファイルが読み取り専用かどうかを判定する関数です。
読み取り専用の場合はTrueを返し、そうでない場合はFalseを返します。
引数ファイルが存在しているかどうかは判定していないため、ファイル存在チェックは事前に行う必要があります。
ファイル存在チェックについては「VBAでファイルの存在をチェックする」をご参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Function IsReadOnly(a_sFilePath) As Boolean Dim ret As VbFileAttribute '// ファイルの属性を取得 ret = GetAttr(a_sFilePath) '// 読み取り専用が設定されている場合 If (ret And vbReadOnly) = vbReadOnly Then IsReadOnly = True Else IsReadOnly = False End If End Function |
使い方
上のIsReadOnly関数の利用例です。
15行目でファイルが読み取り専用かどうかを判定しています。
一応ファイルの存在チェックも入れています。コードは上のリンクにあるファイル存在チェックのソースを使ってます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub IsReadOnlyTest() Dim sFilePath Dim ret As Boolean sFilePath = "D:\test\a.txt" '// ファイル存在チェック ret = IsExistFileDir(sFilePath) If (ret = False) Then Debug.Print "ファイルが存在しない" Exit Sub End If '// 読み取り専用チェック ret = IsReadOnly(sFilePath) If (ret = False) Then Debug.Print "読み取り専用ではない" Exit Sub End If Debug.Print "読み取り専用です" End Sub |
ファイル存在チェックのコードは以下を使ってます。
1 2 3 4 5 6 7 8 9 10 11 |
'// ファイル存在チェック Public Function IsExistFileDir(a_sFilePath) As Boolean Dim a a = Dir(a_sFilePath) If (a <> "") Then IsExistFileDir = True Else IsExistFileDir = False End If End Function |