gpt4 book ai didi

c++ - 以编程方式关闭共享文件

转载 作者:可可西里 更新时间:2023-11-01 13:08:19 25 4
gpt4 key购买 nike

我工作的公司有一个用 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 函数以提高可靠性和 future 安全性,那就更好了。

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

最佳答案

您可以通过编程方式执行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);

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

关于c++ - 以编程方式关闭共享文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32505438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com