Процесс не может получить доступ к файлу, поскольку он используется другой ошибкой процесса

EDIT: Наконец-то я нашел ошибку. Это совершенно не имеет отношения к растровым изображениям, потокам или статике. Похоже, что один из моих коллег забыл удалить вложение электронной почты после отправки письма, и служба вложений почты остается открытой. Я использовал оператор using для всего процесса отправки почты, и он решен. Спасибо всем.

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

Проблема заключается в следующем: это приложение для захвата фотографий, которое использует WebcamSource в качестве веб-камеры. Приложение работает хорошо, когда первая фотография сделана и отправлена ​​пользователю по электронной почте. Однако, когда пользователь снова возвращается к процессу (где он начался до первого запуска), приложение выдает такую ​​ошибку. Неверный код ниже.

public static void SaveImageCapture(BitmapSource bitmap)
        {

                JpegBitmapEncoder encoder = new JpegBitmapEncoder();
         //     bitmap = BitmapFrame.Create(BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
                encoder.Frames.Add(BitmapFrame.Create(bitmap));
                encoder.QualityLevel = 100;
                encoder.Rotation = Rotation.Rotate270;
                try
                {
                    using (FileStream fstream = new FileStream("Photos\\" + fileName + ".jpg", FileMode.Create))
                    {
                        encoder.Save(fstream);
                        fstream.Close();

                    }
                }
                catch (Exception e) {
                    System.Windows.Forms.MessageBox.Show(e.ToString());
                }

        }

Код вылетает на FileStream fstream = new FileStream("Photos\\" + fileName + ".jpg", FileMode.Create) и выдает ошибку

Процесс не может получить доступ к файлу "C:\Users[имя_пользователя]\Dropbox[имя_проекта][имя_проекта]\bin\Debug\Photos", поскольку он используется другим процессом.

Я попытался закрыть поток с веб-камеры, окружить код с помощью try/catch, поместить его в оператор using, добавить поля FileAccess и FileShare, попытаться добавить BitmapCreateOptions.None и BitmapCacheOption.OnLoad (это не позволило мне), создать новые изображения с другими именами, а не перезаписывать то же изображение, удаление изображения после отправки по электронной почте (это дало мне ту же ошибку) и некоторые небольшие меры, которые могут вызвать проблемы с доступом к файлу.


person hevele    schedule 20.08.2013    source источник
comment
попробуйте переименовать изображение... чтобы увидеть, держат ли его потоки.   -  person Anand    schedule 20.08.2013
comment
Я уже пробовал это, я пытался сохранить каждое изображение с разными именами.   -  person hevele    schedule 20.08.2013
comment
не является ли fstream.close избыточным, поскольку использование (filestream) все равно закроет его?   -  person Raven Dreamer    schedule 20.08.2013
comment
Я знаю это, но я хотел убедиться, что он закроет его. Я все равно не могу понять ошибку.   -  person hevele    schedule 20.08.2013
comment
Покажите, как вы создаете растровое изображение   -  person meda    schedule 20.08.2013
comment
Что ты имеешь в виду под не разрешил мне? В чем ошибка?   -  person sara    schedule 20.08.2013
comment
Откуда fileName? Я бы предложил использовать Path.Combine для построения путей. Также, возможно, DropBox синхронизирует файлы, а это другой процесс.   -  person Marc    schedule 20.08.2013
comment
Ошибка: Процесс не может получить доступ к файлу C:\Users[имя_пользователя]\Dropbox[имя_проекта][имя_проекта]\bin\Debug\Photos[имя_файла].jpg, поскольку он используется другим процессом. как я сказал в вопросе   -  person hevele    schedule 20.08.2013
comment
@Marc Марк, я пытался переместить папку за пределы папки Dropbox. Это то же самое, что и в дропбоксе.   -  person hevele    schedule 20.08.2013
comment
Что вызывает ваш метод SaveImageCapture? Вы пытаетесь сохранить изображение обратно в тот же файл, из которого оно было загружено?   -  person Jim Mischel    schedule 20.08.2013
comment
Вы видели stackoverflow.com/questions/4527356/?   -  person sara    schedule 20.08.2013
comment
@sara Это не позволило мне добавить BitmapCacheOption. Я использую BitmapSource, а не BitmapImage. Я предполагаю, что это не позволяет мне из-за этого.   -  person hevele    schedule 20.08.2013
comment
@MertToka, тогда почему бы не создать его следующим образом: BitmapSource img = BitmapFrame.Create(uri,BitmapCreateOptions.None,BitmapCacheOption.OnLoad);. Может быть, в функции вызывающего абонента, а не здесь, было бы лучше.   -  person sara    schedule 20.08.2013
comment
@sara Но я не получаю изображение от uri, я получаю его с веб-камеры. Когда я пишу BitmapSource img = BitmapFrame.Create(bitmap,BitmapCreateOptions.None,BitmapCacheOption.OnLoad); в нем говорится, что лучшая перегруженная функция не принимает растровое изображение в качестве параметра.   -  person hevele    schedule 20.08.2013


Ответы (2)


Я бы предложил сделать имя файла более общим, добавив отметку времени или что-то в этом роде, но, кроме того, в using вызове fstream.Flush() перед fstream.Close()

person ars265    schedule 20.08.2013

Вы ссылаетесь на это местоположение файла (в основном на папку «Фотографии») где-либо еще в своем коде, прежде чем оно достигнет этой точки?

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

Хотя это не идеально, попробуйте вызвать GC.Collect() после encoder.Rotation = Rotation.Rotate270;

person Aaron    schedule 20.08.2013
comment
Я просто добираюсь до папки, чтобы добавить изображение как электронное письмо. Но это позже в коде. - person hevele; 20.08.2013
comment
Должен ли файл, к которому вы пытаетесь получить доступ, всегда находиться в папке Debug? Поскольку это может быть проблемой, в этой папке хранятся библиотеки DLL и т. Д., К которым компилятор имеет доступ. Если файлы хранились во временной папке, то если вы изменили параметры «FileStream», чтобы они указывали на временную папку, это могло бы помочь? Не совсем уверен, но может сработать! - person Aaron; 20.08.2013
comment
Обычно я использую папку Release, но она выдавала ту же ошибку. Чтобы найти проблему, я переключился на отладочную версию. - person hevele; 20.08.2013