以编程方式关闭共享文件

wiz*_*bin 7 c++ windows auto-update

我正在使用的公司有一个用你的vb6编写的程序,它经常更新,并且大多数客户端从映射的网络驱动器运行可执行文件.这实际上几乎没有问题,其中最大的问题是自动更新.目前,updater程序(用c ++编写)重命名现有的exe,然后下载并将新版本放入旧版本的位置.这通常很好,但在某些环境中它只是失败了.

解决方案是从microsoft运行此命令:

for /f "skip=4 tokens=1" %a in ('net files') do net files %a /close
Run Code Online (Sandbox Code Playgroud)

此命令将关闭所有共享的网络文件(大多数),然后更新程序可以替换exe.

在C++中,我可以使用该System("");函数来运行该命令,或者我可以重定向输出net files,并遍历查找有问题的特定文件的结果并运行net file /close命令来关闭它们.但是,如果winapi功能具有类似的功能以获得更好的可靠性和未来的安全性,那将会更好.

有没有办法让我以编程方式查找所有网络共享文件并关闭相关文件?

Adr*_*tti 8

您可以通过编程方式执行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);
Run Code Online (Sandbox Code Playgroud)

有关NetFileEnumNetFileClose的详细信息,请参阅MSDN .请注意,如果有更多数据NetFileEnum可能会返回ERROR_MORE_DATA.

  • 只需很少的修改即可完美运行.我的编译器在枚举函数中的最后一个NULL之后抱怨额外的逗号,我不得不转换pFiles`(BYTE**)&pFiles`并将访问权从`pFile [i] - > fi2_id`更改为成员访问而不是指针访问`pFile [i] .fi2_id` (3认同)