以编程方式关闭共享文件

Close shared files programmatically

我工作的公司有一个用 ye olde vb6 编写的程序,更新非常频繁,大多数客户端 运行 可执行文件来自映射的网络驱动器。这实际上几乎没有问题,其中最大的问题是自动更新。目前,更新程序(用 C++ 编写)重命名现有的 exe,然后下载新版本并将其放入旧版本的位置。这通常工作正常,但在某些环境中它会失败。

解决方法是运行宁this command from 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 函数以提高可靠性和未来安全性,那就更好了。

有什么方法可以让我以编程方式找到所有网络共享文件并关闭相关文件吗?

您可以通过编程方式执行 net file /close 的操作。只需将 lmshare.h 和 link 添加到 Netapi32.dll。您有两个函数要使用:NetFileEnum 枚举所有打开的网络文件(在给定计算机上)和 NetFileClose 关闭它们。

快速(假设程序在同一台服务器上 运行 并且没有 太多 打开的连接,请参阅最后一段)和脏(无错误检查)示例:

FILE_INFO_2* pFiles = 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, need to use a double pointer to get the buffer
  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, pFiles[i].fi2_id);

NetApiBufferFree(pFiles);

有关 NetFileEnum and NetFileClose 的详细信息,请参阅 MSDN。请注意,如果有更多数据可用,NetFileEnum 可能 return ERROR_MORE_DATA