Программно закройте общие файлы
Компания, с которой я работаю, имеет программу, написанную на 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
, Если доступно больше данных.