Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MFC C++ как дождаться освобождения файла для его удаления  (Прочитано 14354 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mihailo
Интересующийся

ru
Offline Offline

« : 05-07-2017 18:40 » 

Здравствуйте. Ситуация такая, на форме есть веббраузер. Приложение извлекает картинку из некого архива, потом грузиться браузером, а потом мне нужно эту картинку безвозвратно удалить. Для этого требуется дождаться пока браузер освободит доступ к картинке, посоветуйте как мне это правильно сделать?  Сейчас у меня вот так, но что-то не нравится мне такая реализация....
   
Код: (C++)
CString fileName;fileName=****;
        //reopen file while file is not busy by IE process(load by script...                               
        HANDLE hFile;
        do {
                 hFile= CreateFile(TEXT(fileName),    
                 GENERIC_READ,          
                 0,      
                 NULL,                  
                 OPEN_EXISTING,        
                 FILE_ATTRIBUTE_NORMAL,
                NULL);                
                Sleep(5);
                        }
        while(GetLastError()==ERROR_SHARING_VIOLATION);
        CloseHandle(hFile);    
        DeleteFile(fileName);
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 05-07-2017 22:30 » 

А что конкретно не нравится?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 06-07-2017 04:22 » 

ещё, наверное, поможет флажок

FILE_FLAG_DELETE_ON_CLOSE

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx



Записан

mihailo
Интересующийся

ru
Offline Offline

« Ответ #3 : 06-07-2017 18:44 » 

В общем извиняюсь, что тема не там где нужно оказалась..
Не понравился код.. функция sleep как-то насторожила)
Но нашел в MSDN подобное(здесь как-бы на русском https://support.microsoft.com/ru-kz/help/316609/prb-error-sharing-violation-error-message-when-the-createfile-function). Алгоритм использует повторные попытки открытия файла(ограниченное кол-во) и проверяет ответный Хэндл, если он равен INVALID_HANDLE_VALUE, то смотрим какая ошибка через GetLastError, если ошибка отказа совместного доступа(ERROR_SHARING_VIOLATION) от пауза, иначе получим хэндл файла.
Что касается флага FILE_FLAG_DELETE_ON_CLOSE то использовать его не получилось, ничего не удаляется, даже при указании FILE_SHARE_DELETE.
Остановлюсь на первом варианте однако..
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 06-07-2017 22:39 » 

Нууу sleep нужна чтобы не загружать процессор бесполезными циклами - циклами ожидания. Если ожидается некое событие в интервале времени, то можно и подождать (поспать). Ничего страшного и необычного в этом нет.

Альтернативные варианты будут гораздо "страшнее". Например, можно получить список всех открытых файлов в системе и проверить наличие в нём нужного.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 07-07-2017 04:54 » 

mihailo,

Цитата
Что касается флага FILE_FLAG_DELETE_ON_CLOSE то использовать его не получилось, ничего не удаляется, даже при указании FILE_SHARE_DELETE.

а в своей то программе файл закрыл ? Может, поэтому и не удаляется.
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 07-07-2017 08:37 » new

Лёш, такой вариант не прокатит.

1. Допустим, ты создаёшь файл с флагом FILE_FLAG_DELETE_ON_CLOSE
2. и держишь его хэндл -> внимане вопрос: когда ТЫ можешь его освободить? Другими словами, как ты узнаешь, что браузер освободил свой хэндл?
Сделаешь это слишком рано, файл удалится ДО того как браузер начнёт его загружать, а если КОГДА-НИБУДЬ, то когда именно?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
mihailo
Интересующийся

ru
Offline Offline

« Ответ #7 : 07-07-2017 18:06 » 

с задержкой понял..и к словам что выше, при таком коде
Код: (C++)
hFile = CreateFile( TEXT(path),
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE,
        NULL);
картинка не грузится в браузер(при этом картинка не удалена, а с файлом работаю в методе ::OnDocumentComplete), а без FILE_FLAG_DELETE_ON_CLOSE все ок.
p/s. файл действительно удаляется при использовании FILE_FLAG_DELETE_ON_CLOSE, при этом необходимым условием является закрытие хэндла файла(как поправил Алексей++)
Тогда вопрос, а как же правильнее будет использовать флаг, или удалить через DeleteFile(path)?
Записан
mihailo
Интересующийся

ru
Offline Offline

« Ответ #8 : 07-07-2017 18:58 » 

похоже у меня получается так что я обращаюсь к файлу раньше чем это успевает делает браузер..
Записан
mihailo
Интересующийся

ru
Offline Offline

« Ответ #9 : 07-07-2017 19:31 » 

парни а посоветуйте как же мне поступить? в общем я извлекаю картинку в директорию, затем гружу картинку в браузер через скрипт(запуская его через InvokeHelper) и дальше я начинаю отслеживать файл через CreateFile, как говорилось, но получается так, что браузер использует файл после моих обращений и поэтому не грузит картинку. Если ставлю задержку перед CreateFile, то все отрабатывает и файл удаляется и с исп-ем флага и через DeleteFile, но это же не вариант. То есть мне либо как-то отслеживать, что картинка загрузилась, либо как-то по другому..
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 07-07-2017 21:45 » 

А почему бы не создавать свою временную директорию в начале программы. Туда скидывать все файлы в течении сессии. А затем в конце работы программы удалять полностью папку? Можно повесить отдельный поток с пониженным приоритетом. Который будет сканировать папку на предмет неиспользованных файлов и соответственно их удалять.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
mihailo
Интересующийся

ru
Offline Offline

« Ответ #11 : 08-07-2017 07:19 » 

в конце работы программы это конечно можно, но хотелось бы сразу после использования...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 08-07-2017 08:35 » 

В винде же есть возможность ожидания объектов. Разве там нельзя узнать момент изменения директории или изменения состояния файла? Это чтобы не пулить впустую.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 08-07-2017 11:01 » 

Ром, в данном случае (чтение браузером) состояние файла не изменяется. А всё остальное можно отлавливать, если у тебя есть хэндл файла. А у браузера свой, да и с какими флагами он его открывает неизвестно.
Проблема стара как мир, и самое простое решение приведено в первом сообщении.
Другие решения (более сложные, с использованием драйвера) интересны для программ-мониторов.
А вот чтобы не "пулить" впустую и существует sleep. 5 мс конечно мало. В данном случае я бы просто оценил время необходимое браузеру для загрузки картинки и использовал бы его в качестве параметра sleep.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 08-07-2017 11:43 » 

"У нас", в POSIX системах, можно было бы просто удалить файл: имя исчезнет, а когда последний хендл закроется, он сам физически удалится.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
mihailo
Интересующийся

ru
Offline Offline

« Ответ #15 : 09-07-2017 20:19 » 

Парни спасибо большое за советы, сделал удаление в основной части моей программы когда формы с браузерами уже закрыты.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines