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


Компания, с которой я работаю, имеет программу, написанную на 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 7

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, Если доступно больше данных.