|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
||||||
Узнать открыт-закрыт файл в другой программе, можно и по заголовку, как угодно05.04.2019, 12:22. Показов 7971. Ответов 17
Метки нет (Все метки)
Давно не могу решить этот "ребус" под названием "Как узнать когда открыт и когда закрыт файл в другой программе. Есть простая программа написана мной в VS 2017, Visual C#, Приложение Windows Forms (.NET Framework), версия FrameWork 4.6. Приложение очень простое, работает только локально, кнопок нет, полный автомат. мониторит одну папку примерно 1 раз в 10 секунд, папка всегда пустая, но когда там появляются файл(фалы) она их обрабатывает самым простым способом, копирует в другое место + оригинал перемещает в еще одно другое место - все это замечательно и безотказно давно работает..., не суть... отвлекся... что мне нужно:
1. Программа увидела файл локально в своей директории которую мониторит, необходимо что бы ДО копирования и ДО перемещения этого файла на 100% точно убедиться (моей программе) что этот файл УЖЕ ТОЧНО на 100% закрыт в другой программе все локально на одном ПК. программа эта в которой этот файл открыт а потом (пользователь его в ручную ЗАКРЫВАЕТ) называется Sound Forge, файл формата .WAV хотя это не важно... далее перечислю как пытался решить эту задачу: Нашел способ как узнать ТОЧНЫЙ заголовок TITLE СаундФорджа (далее СФ) - работает на 100% и я сначала обрадовался - все проблема решена (думал я) в заголовке в СФ пишется имя файла с расширением который там открыт - пока этот открытый файл развернут на макс. внутри окна СФ-а... имя и расширение файла добавляются к TITLE главного окна и я точно вижу это из своей программы этой одной строкой кода:
Узнать дескриптор окна запускаемой программы - сообщение номер 6, чую что я шаге от решения своей проблемы - но не хватает мне тямы понять куда и какую часть кода вставить в свою программу что бы работало. Может найдутся смелчаки, что помогут, старому увы, уже не молодому человеку разобраться в коде или подсказать другой рабочий вариант решения моей проблемы ?
0
|
||||||
| 05.04.2019, 12:22 | |
|
Ответы с готовыми решениями:
17
Как узнать открыт ли файл Excel Как узнать, открыт ли нужный файл Как узнать открыт ли Word файл? |
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
||||||
| 05.04.2019, 12:52 | ||||||
|
totewekotiara,
может просто узнать каким процессом занят файл ? Кликните здесь для просмотра всего текста
https://pastebin.com/VuhVnRC1
0
|
||||||
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
|||||||||||||||||||||
| 06.04.2019, 03:34 [ТС] | |||||||||||||||||||||
|
Только в одной единственной программе этот файл может быть открыт, должен быть способ чуть полегче не в 400 строк програмного кода, у меня вся программа со всей своей логикой занимает меньше... Неужели все так сложно, я к тому что например что бы выяснить текст заголовка главного окна программы мне понадобилась лишь ОДНА строка кода, вот эта для примера:
п.с. - и самое последние, допустим эти 400 строк мне помогут, но что мне с ними делать? какую часть использовать? пытался понять в каких переменных из этих 400 строк будет находиться нужный мне ответ но так и не понял, слишком много переменных во всех этих функциях - и нет четкого понимания в какой из них окажется ответ, ведь мне нужно будет его использовать в блоке if что бы принять дальнейшее логическое решение, а для этого надо понять в какой переменной будет находиться нужный мне ответ...
0
|
|||||||||||||||||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
|
||
| 06.04.2019, 04:37 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
|||||||
| 06.04.2019, 07:53 [ТС] | |||||||
|
если коротко, такой вот вариант try-catch я использовал:
0
|
|||||||
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
|||
| 06.04.2019, 12:28 | |||
|
Касательно 400 строк , из открытого интерфейса там только одна функция - GetProcessesLockingFile , т.е Вам всего лишь нужно оформить этот код в файле cs (или в dll , если смущает лишний код в основном проекте) , с функционалом приватных функциий разбираться не обязательно. GetProcessesLockingFile - возвращает список процессов блокирующих работу с файлом , в вашем случае достаточно убедится , что список пустой , после чего с файлом можно работать. - можно его скопировать в нужное вам место для дальнейшей обработки в вашем приложении , а основной файл удалить после того , как его отпустят.
0
|
|||
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
|||||||||||||||||
| 06.04.2019, 18:10 [ТС] | |||||||||||||||||
Происходит запись звука, ОДНА запись, ОДНОГО файла, локально в одной программе, после запись останавливается, обрабатывается все в одной программе, и потом запись СОХРАНЯЕТСЯ В ТУ САМУЮ ДИРЕКТОРИЮ которую мониторит моя программа - все локально. в ОДИН момент времени может быть обработан и сохранен ТОЛЬКО ОДИН ЕДИНСТВЕННЫЙ ФАЙЛ! директория всегда одна и та же, программа для записи звука всегда одна и та же. код что я накидал выше - работает, проблема возникает только в том случае если пользователь НЕ закрыл файл вручную после того как сохранил его в директории что мониторит моя программа в которой вот та часть кода что отвечает за КОПИРОВАНИЕ а потом и за ПЕРЕМЕЩЕНИЕ.... значит по опыту скажу что функция копирования работает в любом случае нормально, в не зависимости от.... да ни от чего не зависит!!! опыт гвоорит что в 100% нет проблем с копированием файлов - такова специфика, файл НЕ сохраняется до момента пока на 100% не готов, как только готов - только в тот момент он и сохраняется вручную пользователем после чего в 100% должен быть закрыт руками - когда работаю я - нет ни одной ошибки ни с копированием ни с перемещением, но у нас встречаются люди у кого есть проблемы с моторикой рук, они бывают не всегда успевают в течении ОТ 3 секунд закрыть файл, да и просто БАНАЛЬНО ЗАБЫВАЮТ!!! сразу его закрыть - копирование происходит ВСЕГДА нормально без проблем и вопросв, а вот функция перемещения вылетает с ошибкой если файл не закрыт при этом если фордж не свернут, но если он свернут или не активен то и ПЕРЕМЕЩЕНИЕ!!! срабатывает - обкрадывая Фордж, после чего когда пользователь его разворачивает обратно уже Фордж ругается что файла не существует, хотя это не страшно хуэе всего когда фордж остается активным не свернутым и с открытым файлом - вот тогда происходит конкретная ошибка IOExeption - вернее происходила! код что я начеркал выше самый свежий и протестирован был сегодня - на данный момент с этим кодом обработчик try-catch вроде стабильно работает - не вылетает с ошибкой, только каждые 10 секунд всплывающее сообщение выскакивает ну вот из этой части кода:
единственная ситуация когда что то может пойти не так это когда файл не на все окно развернут в фордже при этом фордж еще и свернут должен быть или не активным (перекрыт другими окнами и потерял курсор - только в этом случае происходит операция Копирования и сразу после Перемещения но ругани нет!!! ибо когда фордж не активен он почему то дает полный доступ на файл можете сами смоделировать эту ситуацию программа SF 8.0 вполне известная и не сложна в понимании, Таймер у меня гоняет весь логический код каждые 10 секунд, то есть где то около 9 секунд программа ничего не делает, потом быстро прогоняет простейшую логику, если в директории ничего нет, на этом логика и заканчивается, ждем по таймеру еще 10 секунд и так по кругу бесконечно, но если появился файл его надо скопировать для дальнейшей работы другим людям, а нам этот файл уже не нужен (ПОСЛЕ КОПИРОВАНИЯ!!!) - но и в директории куда его только что сохранили он тоже уже не нужен ибо через 10 секунд моя прога снова его увидет и т.д. по кругу поэтому его надо ПЕРЕМЕСТИТЬ - и вот только с этим иногда происходит затык и то по вине пользователя который забыл закрыть уже СКОПИРОВАННЫЙ и уже не нужный ему файл - именно забыл, или промахнулся мышкой не попал в крестик и вместо закрытыя его сминимизировал внутри Форджа и не заметив это свернул программу а через несколько секунд моя программа наткнутвшись на это вылетает с ошибкой... вернее вылетала раньше... уже не вылетает... код что выше - уже стабилен, ошибки ВООБЩЕ не появляется ни в каких случаях, сегодня сам сидел тестировал - этот код такой вид только сегодня приобрел... у нас тут почти 2 часа ночи... кажется я уже повторяюсь в своем тексте устал... спать давно пора... последнее что хотел сказать, что вы правы - на самом деле до фене мне какой код, сколько его и т.д. - если код все эти 400 строк окажутся рабочими - то какая разница? да нет никакой разницы... завтра попробую, единственное возможно мне потребуется помощь как его оформить в виде dll или как то по другому - ну и как вызывать (какими командами и переменными переданными в эту DLL) - вобщем завтра... спасибо что пытаетесь помочь... и простите что так много текста накидал... читать вобщем то не обязательно... Добавлено через 17 минут не могу сократить свое сообщение, много лишнего накидал... почему так мало времени на редактирование текста дают? ничего не успеваю отредактировать... ладно в предь постараюсь быть более краток.
0
|
|||||||||||||||||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
| 08.04.2019, 15:39 | |
|
.. мне кажется, вы зациклились на задаче, которая принципиально поставлена неверно ... нельзя программисту доверять "моторике рук" (с) пользователя ... пользователь - человек творческий, и может создать любое состояние ... вам просто нужно пересмотреть логику вашего мониторинга в папке, например, не полагаться на единственный файл, который нужно скопировать, а прочитать через foreach список файлов, вычислить дату сохранения и последний сохраненный файл скопировать .. и пусть там лежит хоть двадцать открытых композитором свернутых файлов ... после завершения творческого дня можно всё это почистить ...
0
|
|
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
||
| 09.04.2019, 07:47 [ТС] | ||
|
а блок foreach у меня есть в программе и не один он используется для выяснения перебора всех файлов в поисках дупликата в имени файла и изменении имени, если вдруг будет такой найден, что бы не было перезаписи уже существующего там файла... п.с. - задача поставлена верно, если файл не закрыт сразу моя прога НЕ МОЖЕТ ПЕРЕМЕСТИТЬ его (забыли закрыть)... эта ошибка возникает невероятно редко, у меня ни разу за полгода... но вот пришел новенький и у него ПРОБЛЕМА С МОТОРИКОЙ РУК! (ДЦП, но это не повод отказывать человеку в работе) и вместо ЗАКРЫТЬ попав мышкой в крестик, он ПРОМАХИВАЕТСЯ иногда и минимизирует файл внутри форджа а не закрывает его... Тем более я знаю! что эту ошибку можно решить программно! я уже решил проблему частично, все виды ошибок этого типа исключены, кроме одного, я объяснял в ранних постах эту ситуацию: пока файл внутри форджа РАЗВЕРНУТ НА МАКС! моя прога видит это! и не позволяет выполнить Move + в трей кидает всплывающее сообщение, что вы забыли закрыть файл и т.д... если файл не закрывается через 10 секунд сообщение повторяется и так до тех пор пока его не закроют, а его в любом случае закроют ибо если не закроют он и в сети не появиться для тех кто "дальше по цеху", а от туда ОБЯЗАТЕЛЬНО ПОЗВОНЯТ через некоторое время с претензией - ГДЕ ДЕНЬГИ (ФАЙЛ) ЗИН?.. в общем варианта по прежнему ДВА: 1. Либо я добью этот код и придумаю как избежать последнего маленького нюанса с "забытым открытым файлом который не развернут на макс внутри форджа". либо: 2. Забью на это дело и оставлю все как есть, ошибка эта возникает лишь по вине пользователя и НЕВЕРОЯТНО РЕДКО - почти никогда. п.с. - меня зацепил факт, что я знаю, что ошибку эту можно решить програмно! а не заставлять пользователей запоминать разные нюансы работы программы. Добавлено через 12 минут п.п.с. - ладно я чуть позже (не уверен что сегодня, с этой ошибкой мне не к спеху можно решать сколько угодно по времени это же больше личное, чем необходимое...) в любом случае буду пробовать вариант предложенный товарищем SAU - где 400 строк програмного кода... и возможно еще вариант из темы что я указывал в первом сообщении, там человек говорил что вроде как получил готовое решение поиска названия ДОЧЕРЕНГО окна программы.
0
|
||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
| 09.04.2019, 11:07 | |
|
.. так пишите в лог имя и дату последнего сохраненного файла и не трогайте его потом ... но я не буду настаивать ...
0
|
|
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
||
| 09.04.2019, 11:33 [ТС] | ||
|
0
|
||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
| 09.04.2019, 11:43 | |
|
totewekotiara,
.. если вы не будете делать MOVE, а просто оставите все уже скопированные файлы в рабочей папке (копируя только последний, которого еще нет в логе), то и проблем с доступом не будет .. а когда вы будете архивировать - да хоть ночью по расписанию, когда все саунд-форджи будут закрыты ...
0
|
|
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
||
| 09.04.2019, 12:44 [ТС] | ||
|
Да и если уж искать костыли обхода задачи можно придумать например вот что: 1. Как только файл сохранен, моя программа САМА будет закрывать SF без участия пользователя и не придется даже проверку делать... костыль номер раз. 2. Как только файл сохранен, моя программа легко найдет SF - принудительно его поставит на передний план передав ему курсор и тут же проверить на "вшивость" командой move файл который только что появился в контролируемой директории, а дальше сработает блок try catch который уже работает без ошибок на 100%... костыль номер два. п.с. если еще подумать думаю можно еще костылей напридумывать, но зачем? как по мне надо просто попробовать из тех вариантов что предложил SAU или вообще тот вариант что предложил парень вот из этой темы: Узнать дескриптор окна запускаемой программы разобраться в нём и взять нужный код к себе в программу, но я пока еще не разобрался в этом коде, я уже говорил что программирование для меня больше ХОББИ, я пишу 1-2 программы в 10 лет и то для себя последнее (до этих вот двух в 2018-2019) что я писал было во времена Дельфи 4 а до него во времена FOX PRO когда еще Win95 даже не вышел... старый я уже для дотошного разбирательства и учебы... прошло мое время, теперь только для себя в виде хобби...
0
|
||
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
|||||||
| 11.04.2019, 08:34 [ТС] | |||||||
System.Collections.Generic.List`1[System.Diagnostics.Process] и не важно открыт файл или закрыт, вообще даже если его не существует... еще программа с этим кодом с непонятной переодичностью может просто вылететь с ошибкой отладки... проблема не решена...
0
|
|||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
|
|
| 11.04.2019, 08:37 | |
|
0
|
|
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
|||||||||
| 11.04.2019, 12:17 | |||||||||
Win32API.NtQuerySystemInformation , кроме STАTUS_INFO_LЕNGTH_MISMАTCH или NT_SUCCЕSS , может вернуть и другой результат , который никак тут не учтен. Полагаю , если сократить считывание до одного процесса , можно минимизировать возможные ошибки. , и оберните ее вызов блоком try/catch , дабы выявить источник проблемы.
0
|
|||||||||
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
|||||||||||||||||
| 12.04.2019, 04:12 [ТС] | |||||||||||||||||
пошел другим путем, сделал так:
п.с. - Решение НЕ НАЙДЕНО. есть еще идеи?
0
|
|||||||||||||||||
|
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 10
|
|||||||||||||||||
| 12.04.2019, 05:27 [ТС] | |||||||||||||||||
ответ тот же = 0. но зато все быстрее стало - почти мгновенно, без задержек... или я опять не так сделал что то??? то ли метод не рабочий... то ли еще где то что то не так... я не знаю..., но например вот эта одна строка:
п.с. - извените за БРЮЗЖАНИЕ - просто накипело...
0
|
|||||||||||||||||
| 12.04.2019, 05:27 | |
|
Помогаю со студенческими работами здесь
18
Как проверить открыт порт или закрыт
Как мне сделать так, чтобы данный текстовый файл был открыт один раз при запуске программы и закрыт при закрытии программы? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|