C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

ファイルが"読み取り専用"か調べ、切り替える

"読み取り専用"は、ファイルのプロパティを開いた際の
ここのお話です。

VBAであれば、この辺で調べられますね。
Office TANAKA - FileSystemObject[Attributesプロパティ]


簡単に見つかると思ったのですが、見つからず・・・。
言葉のニュアンスの問題なのかもしれません。

結局、この様なものにしました。

#python
import pathlib
import stat

def is_readonly(pathObj: pathlib.Path) -> bool:
    return (pathObj.stat().st_mode & stat.S_IWRITE) != stat.S_IWRITE

if __name__ == '__main__':

    path = r'C:\temp\hoge.txt'
    pathObj: pathlib.Path = pathlib.Path(path)

    # 確認
    print(f'ReadOnly : {is_readonly(pathObj)}')

    # 変更
    mode = stat.S_IWRITE if is_readonly(pathObj) else ~stat.S_IWRITE
    pathObj.chmod(mode)

    # 確認
    print(f'ReadOnly : {is_readonly(pathObj)}')

正直な所、”これで正解!!”と言う自信が無いです。

あぁ自分はpathlib派なので、pathlibを使います。
(便利だし標準ライブラリだし、何故皆が使わないのか理由が分からない)

pathObj.stat().st_mode

ここでモードを取得しているのですが、戻り値はintでした。
pathlib --- オブジェクト指向のファイルシステムパス — Python 3.11.3 ドキュメント


試している一般的なファイルの場合

読み取り専用ではない -> 33206
読み取り専用 -> 33060

でした。そのままの数値を使おうかとも思ったのですが、
それも違うような気がする匂いしかしません。

念の為、こちらを調べると

print(stat.S_IWRITE) #128

stat --- stat() の結果を解釈する — Python 3.11.3 ドキュメント
でした。
数値が合わないので、恐らくビット演算だろうとの予測で、
上のis_readonly関数を作ってみました。

今の所、これで大丈夫そうなのですが、正解を御存知の方
いらっしゃいましたら教えて頂けると助かります。
(当方Winでシンボリックリンク等も使用していない状態です)