2011-02-01 1 views
1

У меня есть простая форма, которую пользователи могут использовать для загрузки изображений. Он имеет кнопку предварительного просмотра, поэтому, когда пользователь выбирает изображение и нажимает на предварительный просмотр, происходит обратная передача, и я сохраняю изображение во временную папку и изменяю его размер и показываю на странице. оттуда, пользователь может либо submit form, либо edit. Если он подчиняется, все в порядке, я скопирую измененное изображение в правильную папку.перезаписать файлы (изображение) и удалить изображение в C#?

Если он щелкает редактирования и выбирает другое изображение, нужно удалить загруженные файлы (как оригинальные, так и с измененным размером) и если я это сделать:

File.Delete(HostingEnvironment.MapPath(TmpDirectory + PostImageName + ".jpg")); 
File.Delete(HostingEnvironment.MapPath(TmpDirectory + PostImageName + "_small_.jpg")); 

я получаю исключение о том, какой-то другой процесс использует изображение и Can can not delete. (даже после обратной передачи!)

Кроме того, если вместо удаления этого файла я пытаюсь сохранить новое изображение с тем же именем, чтобы оно было перезаписано, оно все равно выдает ошибку, потому что файл уже существует.

Там нет ограничений на количество раз, пользователь может редактировать/предварительный просмотр, так что я не могу сохранить файлы пошагово (это даже не имеет смысла делать это)

Кроме того, после обратной передачи, когда пользователь возвращается в режим редактирования и просматривает форму, в которой элемент управления загрузкой файлов пуст. как я могу получить контроль загрузки файлов, чтобы сохранить значение? все остальные текстовые поля и текстовые области и флажки ведут себя правильно.

обобщить эти мои вопросы:

1), как на земле (или, вернее, в C#) можно удалить файлы, не получив это исключение?
OR
1) как переписать файлы?
2) как заставить элемент управления загрузкой сохранить свое значение между postbacks.

Спасибо.

ответ

1

Исключение говорит само за себя: ваш файл все еще используется/открыт другим процессом, то есть потоком, который вы запустили. Бьюсь об заклад, это процесс, с помощью которого вы открываете файл изображения для чтения. Убедитесь, что вы закрыли соответствующий поток, десять баксов, что он решит вашу проблему.

+0

вот как его сохранить: '' Bitmap img = new Bitmap (HostingEnvironment.MapPath (TmpDirectory + PostImageName + "_big.jpg")); '' так как мне это закрыть ?! – IrishBelly

+0

Я имею в виду, вот как его открыть. Его сохранили с помощью управления загрузкой файлов через '' upImage.SaveAs (...) '' – IrishBelly

+0

пришлось использовать img.Dispose(), и это сработало, спасибо! – IrishBelly

0

Почему вы используете растровое изображение, чтобы открыть файл на стороне сервера? Вы должны просто передать «файл» с помощью

Response.TransmitFile (физическое имя_файла).

Где TransmitFile ожидает (как строку) путь и имя физического файла.

Проблема связана с тем, как вы отправляете файл клиенту. На предыдущем шаге файл по-прежнему заблокирован. Если вы исправите это, вы сможете удалить файл, если это необходимо.

Я не использовал элемент управления FileUpload, но похоже, что вы используете ViewState (это то, что помогает сохранить значения в полях после обратной передачи. Либо элемент управления FileUpload не поддерживает ViewState, либо вы его не настроили для использования ViewState.

Вы можете назначить требуемое свойство элемента управления FileUpload правильным «значением», чтобы он показывал, чего вы ожидаете.Это означало бы, что вам нужно будет зафиксировать указанное значение при отправке формы и просто повторно назначить значение обратно в свойство элемента управления FileUpload во время DataBind.

+0

Привет, Мне нужно открыть изображение с помощью растрового изображения, чтобы изменить его размер, а затем снова сохранить его, поэтому я могу назначить его для предварительного просмотра. Затем мне нужно сохранить измененное изображение в главном каталоге, удалив все файлы во временную папку. – IrishBelly

+1

Вы удаляете экземпляр Bitmap? Можете ли вы показать код, который вы используете для повторного калибровки? Проблема заключается в одной из следующих областей. 1 - способ сохранения загруженного файла. 2 - способ, которым вы его открываете, чтобы изменить размер. 3 - способ сохранения файла изображения с измененным размером. –

+0

Очевидно, что открытие файла в виде растрового изображения с сервера создает блокировку этого файла. Попробуйте это сделать, открыв файл как поток, «сделайте» растровое изображение и закройте поток после редактирования. –

0
  1. Убедитесь, что ваш текущий процесс не имеет ручки для записи открытой к файлам в вопросе
  2. Если нет ручки, то попробуйте выключая сканер вирусов; чрезмерно агрессивный антивирусный сканер может блокировать эти файлы сразу после их создания. Это может помешать вам удалить файлы.
Смежные вопросы