2011-11-10 6 views
3

私がやりたいことは、読み取り専用ファイルを上書きすることです。読み込み/書き込みファイル。C#File.FileMode.Createを使用して読み取り専用ファイルを開きます。

私がFile.Open(file, FileMode.Create)を使用すると、ファイルが存在する場合、ファイルが削除され、新しいファイルが作成されます。 (私はそれが存在する場合、それは単にファイルを開き、内容を取り除くと思うが、それは読み書きとして出会ったファイルに対処できないからである)。

私は別のFileAccess列挙型を試しましたが、どれも私を助けてくれないようです(私はUnauthorizedAccessExceptionを得ています)。

回避策は、私がFile.Openにしようとする前にファイルを読み書きするように設定して、これを行う唯一の方法ですか?

ありがとうございます。

+0

ドキュメントには、作成でファイルを開くには書き込み権限が必要です。例外を投げることは悪いことだとは思えません。むしろ、.NETは読み込み専用ファイルであると私に通知しました。あなたの回避策は私にとって完全に有効な明示的な解決策のようです。 – starskythehutch

+0

例外をスローすることは悪いことではありませんが、毎回それを上書きできるようにする必要があります。 –

答えて

4

ReadOnlyの目的を考えてください。それはファイルへの変更を止めることです。あなたがしようとしているのは、ファイルを変更することです(この場合は上書きします)。あなたはファイルに書き込む前に

File.SetAttributes(filePath, FileAttributes.Normal); 

:私はあなたがする必要があるだろう想像何

は、ファイルの属性を設定されています。

+0

私が@Frantisekに言ったように、私はいつも私はその内容を変えないで、読み取り専用のファイルを削除できると思った! :pああ、私は答えが最初に旗を取り除くことになると考えました。ありがとうございました –

1

はい、これは仕様による動作です。読み込み専用のファイルに書き込むことはできないので、上書きすることもできません。

唯一完全に有効なオプションは、まずReadOnlyフラグを削除することです。

+0

Windowsエクスプローラから読み取り専用ファイルを削除することができますので、奇妙です。私はいつも読み取り専用が変更を止めるためにそこにあったと思ったが完全な削除ではないと仮定した!説明をありがとう。 –

1

FileInfoを使用して、ファイルの属性をReadOnly(権限を持っている場合)から変更し、ファイルを上書きします。

+0

そう思った。 :) ありがとうございました。 –

0

はい、作成する前にreadonly属性を削除する必要があります。ここでは、ファイルが読み込み専用かどうかを検出し、非読み込み属性を設定するためのファイルutilsがあります。

public static bool IsReadOnly(string file) 
    { 
     return (File.GetAttributes(file) & FileAttributes.ReadOnly) == 
       FileAttributes.ReadOnly; 
    } 

    public static void SetNonReadOnlyAttributes(string file) 
    { 
     try 
     { 
      FileAttributes attrs = File.GetAttributes(file); 
      File.SetAttributes(file, attrs & ~FileAttributes.ReadOnly); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(
       string.Format(
        "Error setting non-readonly attributes to file {0}: {1}", 
        file, ex.Message)); 
     } 
    } 
関連する問題