我有以下代码来编写文件。问题是如果我想覆盖同一个文件,它就会被“锁定”。该文件由另一个进程打开。
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);
}
}
我真的不知道我的错误在哪里,或者请求必须关闭的位置。
答案 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();
}
}