Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552

Ошибка "Файл занят другим процессом"

17.07.2018, 17:18. Показов 2525. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написанная программа отправляет некоторые файлы по почте (smtp), после чего эти же файлы переименовывает. Все работает до процесса переименования. Все объекты, которые можно почистил (в т.ч. Dispose()), но наверняка не все, т.к. возникает ошибка "Файл занят другим процессом". Работаю недавно в VisualStudio, не могу понять как отследить объект, который не дает переименовать файл. В гугле не забанен, но ответа не нашел.
Ну и, как полагается код, хотя мой вопрос больше из области понимания дебага.
C#
1
2
3
4
5
6
7
8
9
10
11
            smtp = new SmtpClient {
                Host = "smtp.gmail.com",
                Port = 587,
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                UseDefaultCredentials = false,
                Credentials = new NetworkCredential("почта", "пароль")
            };
smtp.SendCompleted += new SendCompletedEventHandler(smtp_SendCompleted);
//формирование письма
smtp.SendAsync(message, token);
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void smtp_SendCompleted(object sender, AsyncCompletedEventArgs e) {
            
            if (dialog != null) { 
                dialog.Dispose();
            }
            dialog = null;
 
            if (message != null)
            {
                foreach (var attachment in message.Attachments)
                {
                    if (attachment != null)
                    {
                        attachment.Dispose();
                    }
                }
                message.Dispose();
            }
 
            clearMailObjects();
            renameFiles();
            unFreezeButtons();
        }
void clearMailObjects() {
            fromAddress = null;
            if (smtp != null) {
                smtp.Dispose();
                smtp = null;
            }
        }
 
private void renameFile(String oldFilename, String newFilename) {
            FileInfo file = new FileInfo(oldFilename);
            try {
                if (file.Exists) {
                    if (File.Exists(oldFilename)) {
                        File.Move(oldFilename, newFilename);
                    }
                }
            } catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
Заранее спасибо за толчок в нужном направлении.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2018, 17:18
Ответы с готовыми решениями:

Сериализация xml. Ошибка-файл занят другим процессом
В общем то все делаю "по книжке" и почти работает. Но когда я сохраняю файл и пытаюсь его тут же сразу прочесть - ошибка.. Если сохраняю...

Файл занят другим процессом
Вопрос довольно-таки банальный, но я никак не могу его решить. Дело обстоит так: у меня в цикле при первом проходе файл удаляется, другой...

Файл занят другим процессом
the process cannot access the file... because it is being used by another process Пытаюсь удалить файлы, которые до этого добавлял в...

17
29 / 31 / 27
Регистрация: 15.11.2017
Сообщений: 121
17.07.2018, 20:02
TanaTiX, https://blogs.msdn.microsoft.c... al-studio/
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
17.07.2018, 21:18
Цитата Сообщение от TanaTiX Посмотреть сообщение
//формирование письма
Зачем специально обфусцируете вопрос?
В том месте у Вас вообще что угодно может происходить.

Попробуйте добавить перед message.Dispose();
C#
1
message.Attachments.Dispose();
1
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
17.07.2018, 21:30  [ТС]
Могу ошибаться, но постарался не писать лишний код, дабы не запутать. И так много.
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Зачем специально обфусцируете вопрос?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
try {
                var toAddress = new MailAddress(_txMail.Text.ToLower(), "");
                message = new MailMessage(fromAddress, toAddress);
                message.Subject = subject;
                string body = "";
 
                #region logo
                if (Properties.Settings.Default.Logo.Length > 0) {
                    var inlineLogo = new LinkedResource(Properties.Settings.Default.Logo, "image/jpeg");
                    inlineLogo.ContentId = Guid.NewGuid().ToString();
                    body = string.Format(@"<font face='Times New Roman' size='4px'><pre>" + _txAdditionalData.Text + "</pre><br><img src='cid:{0}' /></font>",
                    //body = string.Format(@"<font face='Times New Roman' size='3'>" + Properties.Settings.Default.MailText + "<br>" + _txAdditionalData.Text + "<br><img src='cid:{0}' /></font>",
                    inlineLogo.ContentId);
                    var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
                    view.LinkedResources.Add(inlineLogo);
                    message.AlternateViews.Add(view);
                } else {
                    body = "<font face='Times New Roman' size='4px'>" + Properties.Settings.Default.MailText + "</font>";
                    var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
                    message.AlternateViews.Add(view);
                }
                #endregion
 
                message.Body = body;
                foreach(Attachment att in list) {
                    message.Attachments.Add(att);
                }
                Properties.Settings.Default.AdditionalText = _txAdditionalData.Text;
                Properties.Settings.Default.MailTarget = _txMail.Text;
                Properties.Settings.Default.Save();
 
                smtp.SendAsync(message, token);
            } catch (Exception ex) {
                MessageBox.Show(ex.Message, "Error");
                unFreezeButtons();
                clearMailObjects();
            }
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
17.07.2018, 21:40
Цитата Сообщение от TanaTiX Посмотреть сообщение
foreach(Attachment att in list)
Как и где формируете аттачменты? Я вижу только как Вы их добавляете, но не вижу new Attachment(...

Код выглядит запутанным, в местах, которые Вы не осветили, по прежнему может происходить что угодно.

Сделайте отдельное короткое консольное приложение которого будет выполнять только отправку и дальнейшее переименовывание файла (с простыми body и subject разумеется ) и скиньте сюда, если не лень конечно.

Пробовали добавить код, который я выше написал?
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
17.07.2018, 21:44  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
List<Attachment> attachmentList = new List<Attachment>();
            Attachment attachment;
            if (isZak) {
                attachment = new Attachment(zakFile);
                attachment.Name = Path.GetFileNameWithoutExtension(newFullIndex) + ".txt";
                attachmentList.Add(attachment);
                if (isImages) {
                    attachment = createPDF(zakFile, images);
                    attachmentList.Add(attachment);
                }
            } else {
                if (isImages) {
                    foreach (string file in images) {
                        attachment = new Attachment(file);
                        attachmentList.Add(attachment);
                    }
                }
            }
            sendMessage(attachmentList);
            attachmentList.Clear();
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
17.07.2018, 21:57
Цитата Сообщение от TanaTiX Посмотреть сообщение
createPDF(zakFile, images);
Ну я же говорю, что угодно
Вы уверены что этот метод не лочит файлы?

У Вас код в каждом куске по разному выглядит, по этим кускам невозможно понять однозначно как на самом деле выглядит весь код.
Что Вам мешает опубликовать это все целостно? Поверьте, эти исходники никому не нужны...
1
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
17.07.2018, 22:05  [ТС]

Не по теме:

Цитата Сообщение от Woldemar89 Посмотреть сообщение
Поверьте, эти исходники никому не нужны...
Понимаю, знаю, сам не раз так говорил, но что-то сбоку нашептывает: "Ты гений, не стоит с ними делиться" :D При этом понимаю, что почти всегда дурак. Вот так и сейчас.


В данном случае по невнимательности код не добавил
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
private Attachment createPDF(string zakFile, List<string> images) {
            StreamReader sr = new StreamReader(zakFile, Encoding.GetEncoding("windows-1251"));
            Task<string> task = sr.ReadToEndAsync();
            task.Wait();
 
            string res = task.Result;
            task.Dispose();
            PdfDocument pdf = new PdfDocument();
            //create first page
            PdfPageBase page;
 
            int length = images.Count;
            for (int i = 0; i < length && i < 9; i++) {
                page = pdf.Pages.Add();
                Image image = Image.FromFile(images[i]);
                image = ResizeImg(image, 680, 1000);
                PdfImage imagePDF = PdfImage.FromImage(image);
                page.Canvas.DrawImage(imagePDF, new PointF());
            }
 
            //create next pages
            page = pdf.Pages.Add();
            PdfTrueTypeFont trueTypeFont = new PdfTrueTypeFont(new Font("Lucida Console", 10), true);
            page.Canvas.DrawString(res,
                trueTypeFont,
                new PdfSolidBrush(Color.Black),
                10, 10);
            //save and send pdf
            var memStream = new MemoryStream();
            pdf.SaveToStream(memStream);
            memStream.Position = 0;
            var contentType = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Application.Pdf);
            var reportAttachment = new Attachment(memStream, contentType);
            reportAttachment.ContentDisposition.FileName = pdfResult;
            return reportAttachment;
        }
public Image ResizeImg(Image b, int nWidth, int nHeight) {
            Image result = new Bitmap(nWidth, nHeight);
            using (Graphics g = Graphics.FromImage((Image)result)) {
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(b, new Rectangle(0, 0, nWidth, nHeight), new Rectangle(0, 0, b.Width, b.Height), GraphicsUnit.Pixel);
                g.Dispose();
            }
            return result;
        }
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
17.07.2018, 22:17
Вот тут то конкретная мясорубка и полно утечек памяти, Dispose'ить нужно чуть менее чем все...
Причем порядок важен (в тч что-то после отправки, что-то до нее).
Стримы, имаджи, все PDF объекты наверняка...
На рефакторинг всей этой жести и так достаточно времени уйдет (проще переписать),
а, в моем случае, не имея под рукой всего решения, сами понимаете...

Попробуйте всю программу этот метод в порядок привести и добавьте код из моего первого сообщения.
Удачи
1
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
18.07.2018, 00:12  [ТС]
Woldemar89, а нет способа узнать какой объект/процесс/что-то еще "держит" файл? Если есть возможность посмотреть 100500 переменных с их значением, то где искать это?

Добавлено через 1 минуту
Во флеше (FlashDevelop) в случае ошибки можно пройтись по всему коду от ошибки до исходной строки, ее вызвавшей. В VS или не там смотрю, или этого нет - очень не хватает.
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
18.07.2018, 10:41
Код под C#.NET - управляемый код, реализация IDisposable предназначена для высвобождения ресурсов неуправляемого кода
(дескрипторы ОС, память выделенная не в управляемом пространстве итд)
Отладить неуправляемый код в данном случае невозможно.
Вам остается только найти все IDisposable объекты из используемых, написать грамотный код для работы с ними,
ну а потом уже можно попробовать найти все объекты !IsDisposed в момент ошибки.

Причины, которые не позволяют нормально дебажить в данном случае,
это работа с неуправляемыми ресурсами и заранее, Вы уж простите, обфусцированный код
1
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
18.07.2018, 15:59
TanaTiX, разобрался?
Ради интереса я при ошибки проверил бы а кто реально лочит файл. (Программа lockhunter)
1
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
19.07.2018, 13:14  [ТС]
fufel, был на смене, еще не смотрел. У меня есть для таких случаев unlocker. Но он в данном случае не подходит, т.к. мне определить нужно не программу/процесс, а объект в программе.
Woldemar89, я в c# на уровне нуба, поэтому вполне вероятно, что код обфусцирован, так что мои обиды - их нет, нет на то оснований, вам не за что извиняться.
Попробую немного изменить логику программы, посмотрим что получится. Хотя не думаю, что относительно красоты и структуры кода что-то принципиально поменяется. Подобные вещи не так быстро происходят.
0
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
19.07.2018, 16:05
TanaTiX, а что у тебя за код в renameFiles()?

Добавлено через 7 минут
И я также не могу найти то место как ты цепляеш данный файл к письму.

И также как ты сохряняеш файл на диск чтобы потом его переименовать?
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
20.07.2018, 21:17  [ТС]
Цитата Сообщение от fufel Посмотреть сообщение
И также как ты сохряняеш файл на диск чтобы потом его переименовать?
Файл не сохраняется, он только переименовывается.
Собственно изменил структуру программы - работает. Что именно было причиной сказать не могу - мой навык в c# плох.
Наверное в следующей программе было бы все иначе, но сейчас смысла переделывать нет, видимых ошибок не наблюдаю.
Всем спасибо.
0
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
23.07.2018, 12:09
Цитата Сообщение от TanaTiX Посмотреть сообщение
Файл не сохраняется, он только переименовывается.
Ради интереса объясни что там у тебя происходит в логике. Просто интересно откуда этот файл взялся и зачем ты тогда его переименовываеш?
Иди это один файл который вечно переименовывается?
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
24.07.2018, 12:09  [ТС]
fufel, есть программа, которая помогает при съеме и выдаче заключения ЭКГ, при этом формируется несколько файлов. Их нужно переработать нужным образом, переименовать и отправить на указанный почтовый адрес.
0
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
27.07.2018, 12:50
TanaTiX, Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.07.2018, 12:50
Помогаю со студенческими работами здесь

Файл занят другим процессом
Здравствуйте. Проблема стара как мир, но разобраться с ней у меня не получается. Моя программа в ходе работы вытаскивает из видео кадры и...

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

процесс не может получить доступ к файлу, т.к. этот файл занят другим процессом
Добрый день. Работаю с файлами а именно png Файлы. Делаю удаление пнг файла из папки таким вот способом: ...

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

Исключения System.IO, занят другим процессом
Подскажите пл. какое исключение обрабатывать если каталог (и, или) файл в нём, для удаления занят другим процессом: public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru