Программно закройте общие файлы
Компания, с которой я работаю, имеет программу, написанную на Ye olde vb6, которая обновляется довольно часто, и большинство клиентов запускают исполняемый файл с подключенного сетевого диска. Это на самом деле имеет удивительно мало проблем, самая большая из которых-автоматическое обновление. В настоящее время программа обновления (написанная на c++) переименовывает существующий exe, затем загружает и помещает новую версию на место старой версии. Как правило, это работает нормально, но в некоторых средах это просто не удается.
В решение выполняется эта команда от microsoft:
for /f "skip=4 tokens=1" %a in ('net files') do net files %a /close
Эта команда закрывает все сетевые файлы, которые являются общими (хорошо... большинство), а затем программа обновления может заменить exe.
В C++ я могу использовать функцию System(""); для выполнения этой команды, или я мог бы перенаправить вывод net files, и перебирать результаты, ища конкретный файл, о котором идет речь, и выполнить команду net file /close, чтобы закрыть их. Но было бы намного лучше, если бы были функции winapi, которые имеют аналогичные возможности для повышения надежности и безопасности в будущем.
Существует ли какой-либо способ для меня программно найти все сетевые общие файлы и закрыть соответствующие из них?
1 ответ:
Вы можете программно делать то, что делает
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, Если доступно больше данных.