Filestream不会为其他进程释放文件

时间:2017-09-13 13:19:53

标签: c#

我有以下代码来编写文件。问题是如果我想覆盖同一个文件,它就会被“锁定”。该文件由另一个进程打开。

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中的一个问题。

编辑: 通过研究,我仍然尝试了以下代码,但这导致了相同的结果

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

编辑2: 阅读评论后,它可能与文件流本身无关。以下是有关我的申请的更多信息: 我有一个WPF应用程序,它通过ButtonClick向我的API发送一个帖子。触发如下:

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

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);
        }
    }

我真的不知道我的错误在哪里,或者请求必须关闭的位置。

1 个答案:

答案 0 :(得分:-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();
 }
  }