2017-06-01 8 views
0

データをファイルに追加する必要がありますが、ファイルが存在しない場合は、追加する前にヘッダーを追加する必要があります。添付ファイルを開くためのファイルを新規に表示

FileMode.Appendでファイルを開くと、ファイルが新規であるかどうかわからない場合があります。

私は

FileStream file; 
boolean isNew; 
try 
{ 
    file = File.Open(path, FileMode.CreateNew); 
    isNew = true; 
} 
catch (IOException ex) 
{ 
    file = File.Open(path, FileMode.Append); 
    isNew = false; 
} 

でファイルを開くと、私は、新しいファイルの作成を検出する2つのオープン通話とないの間でファイルを削除する別のプロセスの危険に遭遇します。

作成または追加する場合、追加および検出のための推奨方法は何ですか?このような

+1

ファイルが存在するかどうかを確認してください。存在する場合は、追加します。そうでない場合は、 – Pikoh

+0

を作成します。[File.AppendText(string)]を使用できませんか(https://msdn.microsoft.com/de-de/library/system.io.file.appendtext(v = vs.110).aspx )? –

+0

いいえ、バイナリデータを追加する必要があります – bsagal

答えて

5

これは何が必要でしょうか?

try 
{ 
    var file = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite); 

    if (file.Length == 0) 
    { 
     // do header stuff 
    } 

    // do the rest 
} 
catch (IOException ex) 
{ 
    // handle io ex. 
} 
2

てみてください何か:

if (!File.Exists(path)) 
{ 
    file = File.Open(path, FileMode.CreateNew); 
    isNew = true; 
    return;  
} 
// otherwise append to existing file 
file = File.Open(path, FileMode.Append); 
isNew = false; 
+1

この問題は、あなたの 'File.Exists(path)'とあなたがそれを作成するポイントの間にファイルを作成する可能性があることです。あなたが私の答えでやったようにそれを行うと、ファイルが作成されたり開かれたりするとファイルがロックされるので、それは起こりません。また、ファイル*が存在しない場合、これは2回目の 'File.Open'が' else'ブロックにないので、ファイルを2度開こうとします。 –

+0

@ rory.ap - あなたはifブロックの最後に戻りませんでした。あなたのソリューションは、あなたが与える理由により良いです。 – PaulF

+0

@PaulF - ああ、はい、私はそれを逃した。ありがとう。 –

関連する問題