ホーム 院内・スタッフ紹介 診療時間・アクセス フォトギャラリー
0574-27-6355

院長のメモ帖

2015年10月 1日 木曜日

FileInfoのIsReadOnlyはRefresh()とともに

ちょっとしたファイルバックアップコードを書いていてハマりました。

private static void CopyFile(FileInfo f, FileInfo bak)
        {
            if (!bak.Exists)
                f.CopyTo(bak.FullName);
            bak.IsReadOnly = true;

       }

bakファイルが存在しなければfファイルをコピーしてbakを作成し、読み出し専用フラグを設定する、というだけの簡単なコードですが、出来上がったファイルは、readOnlyどころか、Hidden, Systemその他確認できる限りのフラグが立ってしまっていました。確認のため次のコードを実行した所、

private static void check(FileInfo bak)
        {
            bak.IsReadOnly = true;
       }

問題なく、ReadOnly属性のみついていました。

少しデバッグして気が付いたのですが、まず、bak.Existを呼び出した時点で、bakにはファイルが存在していないことが
キャッシュされます。これは、次行のファイルコピーされた後も変化しません。その次にbakに属性をセットるわけですが、この時点でbakのAttribiutesプロパティーは-1になっており、IsReadOnlyは以下のコードのようにファイルAttribiutesのReadOnlyビットを操作しているのでキャッシュされた-1に対する演算になってしまします。そしてこの結果が実ファイルに書き込まれるので、あらゆるファイル属性がonになって隠しシステムファイルが誕生してしまったわけです。

public bool IsReadOnly {
            get {
                return (Attributes & FileAttributes.ReadOnly) != 0;
            }
            set {
                if (value)
                    Attributes |= FileAttributes.ReadOnly;
                else
                    Attributes &= ~FileAttributes.ReadOnly;
            }
        }

ですから、最初のコードは
private static void CopyFile(FileInfo f, FileInfo bak)
        {
            if (!bak.Exists)
                {
                      f.CopyTo(bak.FullName);
                      bak.Refresh();
                }
            bak.IsReadOnly = true;
       }
と、RefreshしてからIsReadOnlyする必要がありました。

FileInfoやDirectoryInfoでIO操作するときはキャッシュの存在を頭に入れておかないと、時としてとんでもないことが起こりますね(-_-;)



投稿者 美濃加茂市のIT獣医師 近藤 博 | コメント(0)

コメントする

名前:

メールアドレス:

コメント:

カレンダー

2022年3月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

新着情報

一覧を見る

2022/04/05

4/5(火)、午前の診察を休診します。
診察は午後4時からになります。
ご迷惑をおかけして申し訳ありません。

2022/04/08

4/8(金)、午前の診察を休診します。
診察は午後4時からになります。
ご迷惑をおかけして申し訳ありません。

2022/04/13

4/13(水)、診察を休診します。
ご迷惑をおかけして申し訳ありません。


大きな地図で見る〒505-0031
岐阜県 美濃加茂市新池町
1-8-28

お問い合わせ 詳しくはこちら
  • RSS配信
  • RSSヘルプ