异步等待保存文件导致 "Process cannot access file because it is being used by another process" 错误
Async await to save file causes "Process cannot access file because it is being used by another process" error
我有以下代码可以在服务器上保存一个 excel 文件,然后读取它的内容:
if (file.Length > 0)
{
string path = _hostingEnvironment.ContentRootPath + "/CSV-import-students/";
FileStream fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create);
await file.CopyToAsync(fs);
FileInfo fileUploaded = new FileInfo(Path.Combine(path, file.FileName));
using (ExcelPackage package = new ExcelPackage(fileUploaded))
{
StringBuilder sb = new StringBuilder();
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
int rowCount = worksheet.Dimension.Rows;
int ColCount = worksheet.Dimension.Columns;
bool bHeaderRow = true;
}
文件保存在服务器上。但是,当我尝试访问它时,我收到 "Process cannot access file because it is being used by another process" 错误。我怎样才能防止这个错误?有任何想法吗?
几乎总是,当新建一个实现了IDisposable
(例如FileStream
)的class时,你应该使用using
声明:
using (var fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create))
{
await file.CopyToAsync(fs);
}
这将在 using
语句超出范围时自动处理资源,而在 FileStream
的情况下,将刷新写入并关闭文件。这是您问题的根源,因此这将解决您的问题。
但是,您可能还需要处理并发问题。有可能同时处理两个需要处理同一个文件的请求。您应该通过捕获文件访问违规异常并通过重试策略进行响应来规划并发性。 Polly 异常处理库可以提供帮助。
我有以下代码可以在服务器上保存一个 excel 文件,然后读取它的内容:
if (file.Length > 0)
{
string path = _hostingEnvironment.ContentRootPath + "/CSV-import-students/";
FileStream fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create);
await file.CopyToAsync(fs);
FileInfo fileUploaded = new FileInfo(Path.Combine(path, file.FileName));
using (ExcelPackage package = new ExcelPackage(fileUploaded))
{
StringBuilder sb = new StringBuilder();
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
int rowCount = worksheet.Dimension.Rows;
int ColCount = worksheet.Dimension.Columns;
bool bHeaderRow = true;
}
文件保存在服务器上。但是,当我尝试访问它时,我收到 "Process cannot access file because it is being used by another process" 错误。我怎样才能防止这个错误?有任何想法吗?
几乎总是,当新建一个实现了IDisposable
(例如FileStream
)的class时,你应该使用using
声明:
using (var fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create))
{
await file.CopyToAsync(fs);
}
这将在 using
语句超出范围时自动处理资源,而在 FileStream
的情况下,将刷新写入并关闭文件。这是您问题的根源,因此这将解决您的问题。
但是,您可能还需要处理并发问题。有可能同时处理两个需要处理同一个文件的请求。您应该通过捕获文件访问违规异常并通过重试策略进行响应来规划并发性。 Polly 异常处理库可以提供帮助。