2017-09-13 8 views
-2

ファイルを書き込むためのコードは次のとおりです。問題は、同じファイルを上書きしたい場合、「ロックされている」ということです。ファイルは別のプロセスによって開かれます。Filestreamは他のプロセスでファイルを解放しません。

using (FileStream fs = new FileStream("C:\\New\\" + fileName, FileMode.Create, FileAccess.ReadWrite)) 
using (StreamWriter str = new StreamWriter(fs)) 
{ 
    str.Write(jsonFile); 
    str.Dispose(); 
    str.Close(); 
} 

json文字列をAPIに送信してから、ファイルを生成します。だから私はそれがIISの問題かもしれないと思う。

EDIT:Researchが 私はまだ、次のコードを試してみましたが、同じ結果にどのつながる

using (FileStream fs = new FileStream("C:\\New\\" + fileName, FileMode.Create, FileAccess.ReadWrite)) 
{ 
    StreamWriter sw = new StreamWriter(fs); 
    sw.Write(jsonFile); 
    fs.Flush(); 
    fs.Close(); 
} 

EDIT 2:コメントを読んだ後、それはおそらくにファイルストリームとは何の関係もありません 自体。ここに私のアプリケーションに関する詳細があります: 私はButtonClickを通して私のAPIに投稿を送るWPFアプリケーションを持っています。これは、次のようにトリガーされます。

private async void btnSend_Click(object sender, RoutedEventArgs e) 
    { 
     await Seal(); 
    } 

シール方法は、次の言葉:

private async System.Threading.Tasks.Task Seal() 
    { 
     var result = await RequestManager.DoPost<bool>("FOO", foo); 
    } 

RequestManagerには、次の言葉:

public static async Task<R> DoPost<R>(String route, Object payload, String contenttype) 
    { 
     var serializer = new JavaScriptSerializer(); 

     route = route.StartsWith("/") ? route : "/" + route; 

     var content = new StringContent(serializer.Serialize(payload), Encoding.UTF8, contenttype); 

     var response = await client.PostAsync(RequestManager.API_URL + route, content); 

     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      var result = await response.Content.ReadAsStringAsync(); 
      return (R)serializer.Deserialize(result, typeof(R)); 
     } 
     else 
     { 
      throw new ResponseException(response.StatusCode, response.Content.ReadAsStringAsync().Result); 
     } 
    } 

私の誤差がある場合、私は本当に知りません、または要求をクローズする必要がある場所。

+5

'Dispose'と' Close'呼び出しは 'using'文 –

+1

で冗長である、これは、あなたや他のプロセスによってロックされていることができ、より多くの情報が必要です。再作成手順を提供してください。たとえば、これは正確に何を呼んでいますか?これはマルチユーザー、マルチスレッド、またはWeb環境ですか?明らかに、同時に複数のプロセスによってファイルに書き込むことはできません。 – Liam

+1

https://xkcd.com/1888/ –

答えて

-1

このエラーは、複数のスレッドが同じファイルに書き込もうとしているときに発生する可能性があります。あなたのコードは、上記の少しの修正で動作します

private static object lk = new object(); 
    lock (lk) 
     { 
    using (FileStream fs = new FileStream("C:\\New\\" +fileName,FileMode.Create, FileAccess.ReadWrite)) 
using (StreamWriter str = new StreamWriter(fs)) 
{ 
str.Write(jsonFile); 
str.Dispose(); 
str.Close(); 
} 
    } 
+0

そこには2つのusingステートメントがあります。最初のusingステートメントですべてをラップするとうまく動作します。 – codein

+0

前に並行性の問題があった場合、2^Nがあります。このロックは、同じファイルに書き込むかどうかに関係なく、すべてのファイルの書き込みをブロックします。とにかく 'FileStream'や' using'が壊れていると誰が言いましたか?彼らは余分なロックを必要とせずに何千ものWebサイトによって、1日あたり何百万回も使用されています。問題が発生したときには、それはエラーコードである*コード*です –

+0

すべてのコードサンプルで問題を再現しようとしましたが、ロックを追加して解決したParallelでファイルに書き込もうとしたとき以外はすべて渡されました。開発マシン上にいる場合は、ファイルを手動で削除して、再度テストしてみてください。 – codein

関連する問題