如果你有一个想法的本地路径是什么,你可以蛮力它通过测试:(TODO:让一切Unicode)的
// Helper function to make a name unique.
std::string computername()
{
static std::string name = []() {
WCHAR buf[MAX_COMPUTERNAME_LENGTH];
DWORD len = MAX_COMPUTERNAME_LENGTH;
GetComputerNameEx(ComputerNameNetBIOS, buf, &len);
return std::string(buf, buf + len);
}();
return name;
}
int main()
{
std::string dir = "C:\\FindThisShare\\";
// First, create marker
std::string testfile = computername() + " 038D2B86-7459-417B-9179-90CEECC6EC9D.txt";
std::ofstream test(dir + testfile);
test << "This directory holds files from " << computername()
<< std::endl;
test.close();
// Next, find the UNC path holding it.
BYTE* buf;
DWORD numEntries;
NetShareEnum(nullptr, 1, &buf, MAX_PREFERRED_LENGTH, &numEntries,
&numEntries, nullptr);
auto data = reinterpret_cast<SHARE_INFO_1*>(buf);
std::string retval;
for (int i = 0; i != numEntries; ++i)
{
auto const& entry = data[i];
std::wstring tmp(entry.shi1_netname);
std::string share(tmp.begin(), tmp.end());
std::string uncdir = "\\\\" + computername() + "\\" + share + "\\";
if (PathFileExistsA((uncdir + testfile).c_str()))
{
printf("Exists");
}
}
remove((dir + testfile).c_str());
NetApiBufferFree(buf);
}
我尝试了WNetOpenEnum的第一个参数的标志的所有组合,但只有RESOURCE_GLOBALNET似乎让我枚举共享。如果你知道不同,我会很乐意尝试。我刚刚使用http://msdn.microsoft.com/en-us/library/aa385341(VS.85).aspx中的示例代码,并以几种不同的方式破解了它 - 其中没有一个非常高效,所以我没有发布代码。 – philsquared 2010-05-04 12:35:19
您链接的示例代码是递归的,因此它枚举整个网络。你是说你不知道如何让它不递归?只需传入与本地计算机相对应的NETRESOURCE即可。 – Gabe 2010-05-04 12:53:43
从我所看到的那里没有办法在本地机器上获得NETRESOURCE而没有可能迭代整个网络来获得它 - 是否有快捷方式? – philsquared 2010-05-04 13:19:18