перезаписать файлы (изображение) и удалить изображение в c #? - PullRequest
1 голос
/ 01 февраля 2011

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

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

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

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

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

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

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

Подводя итог, вот мои вопросы:

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 01 февраля 2011

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

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

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

Response.TransmitFile (PhysicalFileNameAndPath).

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...