1

Я сохраняю изображение холста на сервер с помощью FileStream. Он работает отлично в первый раз, но если пользователь снова посещает страницу в течение того же сеанса (без закрытия браузера), он выдает сообщение об ошибке «Процесс не может получить доступ к файлу» C: \ inetpub \ wwwroot \ CarmelFinancialWeb \ Contracts \ MyUniqueImageFileName. png ', потому что он используется другим процессом ». Я попытался использовать close и dispose в FileStream, но это все еще происходитКак закрыть поток после создания файла или создать другой доступ к вновь созданному файлу?

Процесс: - Пользователь переходит на страницу AssignContract, вывешивает на холсте, нажимает кнопку сохранения. - Изображение сохраняется в файле - Пользователь снова нажимает кнопку сохранения (даже после ожидания несколько минут) - Файл с сообщением об ошибке используется другим процессом.

[AuthorizeAdmin] 
    [HttpPost] 
    public ActionResult AssignContract(string ID, ModelContract tempCurrentContract, string imageData) 
    { 
     try 
     { 
      if (imageData != null) 
      { 
       string fileName = "MyUniqueImageFileName.png"; 
       string fileNameWitPath = Path.Combine(Server.MapPath("~/Contracts"), fileName); 

       using (FileStream fs = new FileStream(fileNameWitPath, FileMode.Create)) 
       { 
        using (BinaryWriter bw = new BinaryWriter(fs)) 
        { 
         byte[] data = Convert.FromBase64String(imageData); 
         bw.Write(data); 
         bw.Close(); 
         bw.Dispose(); 
        } 
        fs.Close(); 
        fs.Dispose(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
... 

Update

не имели никакого воздействия на это. У кого-нибудь есть предложение о том, как предотвратить блокировку файла или как разблокировать файл? Спасибо.

+1

Вы не заблокируете файл здесь. Что-то еще происходит. Если бы я должен был догадаться, я бы сказал, сканер вирусов. Лучше всего посмотреть этот файл после его создания и посмотреть, какой процесс его блокирует. – Will

+0

Также вам не нужно вызывать fs.Dispose, используемый блок сделает это за вас. Может быть, вызов fs.Flush может помочь. (Я не так хорош с FileStreams !!) –

+0

Спасибо за комментарии. Интересно, что вирусный сканер может заблокировать его. Как я могу сказать, что блокирует файл? У меня есть другое место, которое ставит подпись в формате pdf. Может ли быть причиной блокировки? Если да, то как я его разблокирую? System.Drawing.Image image = System.Drawing.Image.FromFile (HttpContext.Current.Server.MapPath ("~/Contracts/MyUniqueImageFileName.png")); – boilers222

ответ

0

Проблема заключается в том, что файл блокируется каждый раз, когда я обращаюсь к изображению, чтобы передать его другому процессу. Таким образом, для каждого случая, когда я к нему доступ:

System.Drawing.Image image = System.Drawing.Image.FromFile(HttpContext.Current.Server.MapPath("~/Contracts/MyUniqueImageFileName.png")); 

я должен был распоряжаться изображением:

image.Dispose(); 

Я заметил, если бы я подождал несколько минут и пытались сохранить новый образ, это было не заблокирован. Так что, возможно, функция Dispose происходит автоматически через определенный промежуток времени? Если кто-то знает это или имеет способ разблокировать все файлы перед написанием нового, мне будет интересно, как это делается.

Смежные вопросы