powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Удалить файл, "открытый в другой программе".
10 сообщений из 10, страница 1 из 1
Удалить файл, "открытый в другой программе".
    #39308045
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вкратце, VOIP-система(OPAL), IVR-подсистема.
Выполняемая задача: проигрывание файла test.wav в линию
при помощи vxml-скрипта, не суть:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
        ivrXML << "ivr:<?xml version=\"1.0\"?>"
                  "<vxml version=\"1.0\">"
                    "<form id=\"PlayFile\">"
                      "<transfer bridge=\"false\" dest=\"pc:*;Auto-Answer=1\">"
                        "<audio src=\"" << PURL(PFilePath("C:\\...\\audioout\\test.wav")) << "\"/>"
                      "</transfer>"
                    "</form>"
                  "</vxml>";



Все-то оно работает как надо, но есть проблема.
Файл test.wav проиграли, вызов давно закончился и т.п.
но при попытке удаления test.wav (да хоть бы ручками из проводника) файл остается "закушенным", т.е.
Действие не может быть выполнено, так как этот файл открыт в <имя проги.exe>

И без закрытия/перезапуска <имя проги.exe> никак.

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

Т.е. надо как-то это "подрихтовать",
1) либо извне (из другого (Net-овского) .exe)
2) ну либо из самой <имя проги.exe>, но где он его "закусывает" я вряд ли найду.
Т.е. хотя бы из-самой <имя проги.exe> дать команду на "разблокировку файла", зная путь к нему.

Есть идеи? Я пока не знаю куда копать.
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308057
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если дать команду на "разблокировку", то https://technet.microsoft.com/en-us/library/bb490961.aspx
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308146
Фотография s Baltiki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

А пробовали вначале файл переименовать, а потом удалить?
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308224
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Смотри кто его держит и решай.
Windows Sysinternals
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308306
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, можно наверное как-то грубо поступить... но есть шанс, что епнится удерживающий процесс... ну и вообще "Это не наши методы Сеня!"
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308309
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser, так можно и свой процесс потерять вместе с EXE. Какой-нибудь антивирь сочтет за нездоровую активность и упрячет в карантин.
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308499
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я с вами абсолютно согласен, что надо копать сорцы и искать почему Wav не закрывается.
Но там черт ногу сломит.
Сделал тестовый проект (дико извиняюсь, потому что это не C++ форум).
Считаю что виноват файл vxml.cxx
Лог грубо такой:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 0:02.529	              Pool:4496	        vxml.cxx(2240)	VXML	Opening channel 0212A280
  0:02.530	              VXML:8340	        vxml.cxx(915)	VXML	Execution thread started
  0:02.547	              Pool:4496	        vxml.cxx(654)	VXML	Loading file: C:\Users\Dmitry\Desktop\test_ivr\test.vxml
  0:02.548	              Pool:4496	        pxml.cxx(541)	XML	Loaded XML vxml
  0:02.548	              VXML:8340	        vxml.cxx(1101)	VXML	**** Processing VoiceXML element: <form> ***
  0:02.548	              VXML:8340	        vxml.cxx(1101)	VXML	**** Processing VoiceXML element: <audio> ***
  0:02.549	              VXML:8340	        vxml.cxx(2325)	VXML	Opened WAV file C:\Users\Dmitry\Desktop\test_ivr\test.wav
  0:02.549	              VXML:8340	        vxml.cxx(2537)	VXML	Enqueueing playable File with arg C:\Users\Dmitry\Desktop\test_ivr\test.wav for playing
  0:02.923	       Media Patch:1592	        vxml.cxx(2325)	VXML	Opened WAV file C:\Users\Dmitry\Desktop\test_ivr\test.wav
  0:02.923	       Media Patch:1592	        vxml.cxx(197)	VXML	Playing file "C:\Users\Dmitry\Desktop\test_ivr\test.wav"
  0:12.600	       Media Patch:1592	        vxml.cxx(2463)	VXML	Finished playing 154560 bytes
  0:12.600	              VXML:8340	        vxml.cxx(1008)	VXML	End of VoiceXML elements, exiting.
  0:12.601	              VXML:8340	        vxml.cxx(2257)	VXML	Closing channel 0212A280


Номера строк файла указаны в скобках, сам файл прилагаю.
Все вроде корректно: но C:\Users\Dmitry\Desktop\test_ivr\test.wav после проигрывания не удаляется.
Открывается он (2325)
PWAVFile * PVXMLChannel::CreateWAVFile(const PFilePath & fn, PBoolean recording)

Задница в том, что эта версия Opal/ptlib очень старая.
Но использовать более новую (а там это думаю пофиксено) не могу, глючит основной функционал кот. мне нужен.
Написать автору - в лучшем случае пошлет к новой версии- не вариант.
А отличия в версиях - огромны, чтобы как-то пытаться сравнить и впихнуть куски кода.
Остается только копать этот код.
Хотя вот счас вроде выписал лог, файл скорее всего открывается дважды:
в VXML:8340 - для Enqueueing (выяснение что за файл?)
и в Media Patch:1592 - (для проигрывания?)
и кто-то его подозреваю забывает или по каким-то причинам не может закрыть

Если не решу этот вопрос, не смогу добавить функционал в прогу.
Потому как логично иметь возможность удалять проигранные файлы из GUI без остановки системы, а как их удалишь если они закушены.
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308524
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, посмотрите лучше повнимательнее, как вы работаете с либой... возможно, имеет смысл инстанцировать(new) по необходимости и, как только она пропадает - delete.
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308547
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

в этом приложении запущен C++ exe (постоянно, VOIP-система).
Общение с GUI/net происходит через команды (mailslot-ы).
Перегружать систему за-ради удаления каких-то wav - ну сам понимаешь.

Вариант нормального взаимодействия с системой (через API) у меня тоже наработан, но не в этом приложении, но суть от этого не меняется, перегружать систему из-за ерунды не вариант.

Поэтому надо либо копать коды чтоб отпускали файл, либо отказаться от внедрения довольно заманчивого функционала (будет обидно-С).
...
Рейтинг: 0 / 0
Удалить файл, "открытый в другой программе".
    #39308669
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел место "закусывания".
c:\ptlib\src\ptclib\vxml.cxx

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
PBoolean PVXMLSession::TraverseAudio()
{
...
          if (RetreiveResource(url, contentType, fn, useCache)) {
            PWAVFile * wavFile = vxmlChannel->CreateWAVFile(fn);
            if (wavFile == NULL)
              PTRACE(2, "VXML\tCannot create audio file " + fn);
            else if (!wavFile->IsOpen())
              delete wavFile;
            else {
              delete wavFile;
              loaded = true;
              PlayFile(fn, 0, 0, !useCache);   // make sure we delete the file if not cacheing
            }
...



PWAVFile * wavFile -внутренний объект, открывает файл, чего-то там проверяет (видимо корректность файла),
и далее нигде не используется,
в PlayFile передается fn - путь к файлу а не wav-объект, он там открывается (и тьфу-тьфу корректно закрывается) по новой.
Сделал
delete wavFile
(выделенная строчка которой в исходнике не было)
проигрывает как положено
после проигрывания файл можно удалить как должно (например из проводника).

Так что гадости о которых спрашивал отменяются.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Удалить файл, "открытый в другой программе".
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]