Я использую файловый поток для получения большого файла в моем контроллере. коды ниже:
[HttpPost]
public JsonResult Create(string qqfile, Attachment attachment)
{
Stream inputStream = HttpContext.Request.InputStream;
string fullName = ingestPath + Path.GetFileName(qqfile);
using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write))
{
try
{
var buffer = new byte[1024];
int l = inputStream.Read(buffer, 0, 1024);
while (l > 0)
{
fs.Write(buffer, 0, l);
l = inputStream.Read(buffer, 0, 1024);
}
return Json(new {success = "true"});
}
catch (Exception)
{
return Json(new {success = "false"});
}
finally
{
inputStream.Flush();
inputStream.Close();
fs.Flush();
fs.Close();
}
}
}
И в методе ajax моей страницы я добавляю кнопку, чтобы отменить загрузку файла и удалить незаконченный файл с диска. Запрос Ajax к действию с именем «Отмена»:
[HttpPost]
public JsonResult Cancel(string filename)
{
string localName = HttpUtility.UrlDecode(filename);
string fullName = ingestPath + Path.GetFileName(localName);
if (System.IO.File.Exists(fullName))
{
System.IO.File.Delete(fullName);
}
return Json(new {cancle = true});
}
Проблема в том, что файл не может быть удален, а сообщение об исключении -
процесс не может получить доступ к файлу 'e: \ tempdata \ filename_xxx.xxx', потому что он используется другим процессом.
Я думаю, что это потому, что файловый поток этого файла не закрыт. Как я могу закрыть этот поток файлов и удалить файл в моем действии «Отмена»?
-
OH! Я нашел способ решить это сейчас.
using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write))
Это просто, просто объявите свойство fileshare: FileShare.Delete
using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write, FileShare.Delete))
Я потратил 4 часа на Google, отладку и тестирование, а также попытался решить его. Всего через 10 минут после того, как я спросил stackoverflow, я получил ответ сам. Интересно! И надеюсь, что это кому-то тоже пригодится.