Закройте общие файлы программно

В компании, с которой я работаю, есть программа, написанная на ye olde vb6, которая обновляется довольно часто, и большинство клиентов запускают исполняемый файл с подключенного сетевого диска. На самом деле это удивительно мало проблем, самая большая из которых — автоматические обновления. В настоящее время программа обновления (написанная на c ++) переименовывает существующий exe-файл, затем загружает и помещает новую версию на место старой версии. Это обычно работает нормально, но в некоторых средах просто не работает.

Решение работает эта команда от Microsoft:

for /f "skip=4 tokens=1" %a in ('net files') do net files %a /close

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

В C ++ я могу использовать System(""); функция для запуска этой команды, или я мог бы перенаправить вывод net filesи перебрать результаты поиска конкретного файла и запустить net file /close Команда, чтобы закрыть их. Но было бы намного приятнее, если бы существовали функции winapi, которые имеют схожие возможности для повышения надежности и безопасности в будущем.

Есть ли способ для меня, чтобы программно найти все общие сетевые файлы и закрыть соответствующие?

7

Решение

Вы можете программно делать то, что net file /close делает. Просто включите lmshare.h и ссылка на Netapi32.dll, У вас есть две функции для использования: NetFileEnum перечислить все открытые сетевые файлы (на данном компьютере) и NetFileClose закрыть их.

Быстро (предполагается, что программа работает на том же сервере и не Очень много открытые соединения, см. последний абзац) и грязный (без проверки ошибок) пример:

FILE_INFO_2* pFile = NULL;
DWORD nRead = 0, nTotal = 0;

NetFileEnum(
NULL, // servername, NULL means localhost
"c:\\directory\\path", // basepath, directory where VB6 program is
NULL, // username, searches for all users
2, // level, we just need resource ID
(LPBYTE*)pFiles, // bufptr,
MAX_PREFERRED_LENGTH, // prefmaxlen, collect as much as possible
&nRead, // entriesread, number of entries stored in pFiles
&nTotal, // totalentries, ignore this
NULL //resume_handle, ignore this
);

for (int i=0; i < nRead; ++i)
NetFileClose(NULL, pFile[i].fi2_id);

NetApiBufferFree(pFile);

Обратитесь к MSDN для получения подробной информации о NetFileEnum а также NetFileClose. Обратите внимание, что NetFileEnum может вернуться ERROR_MORE_DATA если больше данных доступно.

8

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector