【问题标题】:Close shared files programmatically以编程方式关闭共享文件
【发布时间】:2015-09-10 15:03:14
【问题描述】:

我正在与之合作的公司有一个用 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 函数以提高可靠性和未来安全性,那就更好了。

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

【问题讨论】:

  • 听起来这是一个特定于 Windows 的 C++ 问题...
  • 是的,抱歉我加个标签
  • 我建议你搜索 MSDN 找到一些可以帮助你关闭网络文件的 Windows API。
  • 好电话,@ThomasMatthews 我经常忘记做显而易见的事情。找到decent resource,一旦我得到一个可行的解决方案,我会发布一些额外的信息。
  • 请注意,虽然这确实会关闭文件,但这也意味着客户端在下次需要请求分页可执行文件时会崩溃。

标签: c++ windows auto-update


【解决方案1】:

您可以以编程方式执行 net file /close 所做的事情。只需包含lmshare.h 并链接到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);

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

【讨论】:

  • 只需要很少的修改就可以完美运行。我的编译器抱怨枚举函数中最后一个 NULL 之后的额外逗号,我不得不强制转换 pFiles (BYTE**)&amp;pFiles 并将访问从 pFile[i]-&gt;fi2_id 更改为成员访问而不是指针访问 pFile[i].fi2_id
  • @wizebin 你是对的,我在这里写的没有测试。我的错,谢谢!
  • lpvoid 行需要改成 (LPBYTE*)&pFiles, // bufptr
  • 我可能在某处添加了一个 s,因为除了我的行之外,你到处都有 pFile。
猜你喜欢
  • 1970-01-01
  • 2018-11-09
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多