如何将UNC转换为本地路径

2023-12-13

我正在寻找一种方法来获取给定 UNC 路径的相应本地路径。微软提供了一个小型库CheckLCL以此目的。并非所有 Windows 版本都支持此库。有人知道这方面的开源方法吗?

还有MAPI功能来自UNC的ScLocalPath,但不确定它是否适用于所有平台。


在 MSDN 上进行一些谷歌搜索和挖掘后,我得到了以下解决方案:

#include <Crtdbg.h>    // for debug stuff
#include "Winnetwk.h"  // for WNetGetUniversalName()
#include "Lm.h"        // for NetShareGetInfo()
#include "pystring.h"  // from http://code.google.com/p/pystring

#pragma comment( lib, "Mpr.lib" )       // for WNetGetUniversalName()
#pragma comment( lib, "Netapi32.lib" )  // for NetShareGetInfo()

//-----------------------------------------------------------------------------
// converts x:\\folder -> \\\\server\\share\\folder
bool ConvertLocalPathToUNC(const char* szFilePath, std::string& strUNC)
{
  // get size of the remote name buffer
  DWORD dwBufferSize = 0;
  char szBuff[2];
  if (::WNetGetUniversalName(szFilePath, UNIVERSAL_NAME_INFO_LEVEL, szBuff, &dwBufferSize) == ERROR_MORE_DATA)
  {
    // get remote name of the share
    char* buf = new char[dwBufferSize];
    UNIVERSAL_NAME_INFO* puni = (UNIVERSAL_NAME_INFO*) buf;

    if (::WNetGetUniversalName(szFilePath, UNIVERSAL_NAME_INFO_LEVEL, buf, &dwBufferSize) == NO_ERROR)
    {
      strUNC = puni->lpUniversalName;
      delete [] buf;
      return true;
    }
    delete [] buf;
  }

  return false;
}

//-----------------------------------------------------------------------------
// converts \\\\server\\share\\folder -> x:\\folder
bool ConvertUNCToLocalPath(const char* szUNC, std::string& strLocalPath)
{
  // get share name from UNC
  std::string strUNC(szUNC);
  std::vector< std::string > vecTokens;
  pystring::split(strUNC, vecTokens, _T("\\"));

  if (vecTokens.size() < 4)
    return false;

  // we need wchar for NetShareGetInfo()
  std::wstring strShare(vecTokens[3].length(), L' ');
  std::copy(vecTokens[3].begin(), vecTokens[3].end(), strShare.begin());

  PSHARE_INFO_502  BufPtr;
  NET_API_STATUS   res;
  if ((res = NetShareGetInfo(NULL, const_cast<LPWSTR>(strShare.c_str()), 502, (LPBYTE*) &BufPtr)) == ERROR_SUCCESS)
  {
    // print the retrieved data.
    _RPTF3(_CRT_WARN, _T("%ls\t%ls\t%u\n"), BufPtr->shi502_netname, BufPtr->shi502_path, BufPtr->shi502_current_uses);

    std::wstring strPath(BufPtr->shi502_path);
    strLocalPath.assign(strPath.begin(), strPath.end());

    // build local path
    for (size_t i = 4; i < vecTokens.size(); ++i)
    {
      if (!pystring::endswith(strLocalPath, _T("\\")))
        strLocalPath += _T("\\");
      strLocalPath += vecTokens[i];
    }

    // Validate the value of the shi502_security_descriptor member.
    if (IsValidSecurityDescriptor(BufPtr->shi502_security_descriptor))
      _RPTF0(_CRT_WARN, _T("It has a valid Security Descriptor.\n"));
    else
      _RPTF0(_CRT_WARN, _T("It does not have a valid Security Descriptor.\n"));

    // Free the allocated memory.
    NetApiBufferFree(BufPtr);
  }
  else
    return false;

  return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将UNC转换为本地路径 的相关文章

随机推荐

  • CSS 水平滚动溢出与 jQuery 滑块

    我正在尝试设置一个全屏 jquery 滑块 我将项目分为两个步骤 1 css 和 2 js 1 CSS 下面是我正在拍摄的图片 没有固定高度 下面是我到目前为止不起作用的代码
  • 如何在给定时间后重新加载网页的一部分?

    我想做的是 根据特定条件显示一条消息 因此 我将在给定时间后连续读取数据库 并相应地向用户显示消息 但我希望该消息仅在页面的一部分 比如说 DIV 上更新 任何帮助 将不胜感激 谢谢 这可以使用setInterval and jQuery
  • 如何将日期对象添加到 C# 列表? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 早些时候我已经发布了这个问题排序日期和时间 答案是mi
  • 虚拟析构函数是继承的吗?

    如果我有一个带有虚拟析构函数的基类 派生类也有声明虚拟析构函数吗 class base public virtual base class derived base public virtual derived 1 derived 2 具体
  • Android 中的水平 ListView?

    是否有可能使ListView水平的 我已经使用图库视图完成了此操作 但所选项目会自动到达屏幕中央 我不希望所选项目位于我单击的同一位置 我该如何解决这个问题 我的想法是设置ListView带有水平滚动条 分享你的想法 根据 Android
  • 正则表达式在 C 中失败,在线测试通过

    当我在 C 中使用应该有效的正则表达式时 它会失败 当我将这个正则表达式粘贴到此处时 https regex101 com并测试它似乎很好 正如预期的那样 clang 3 8 0 include
  • 我的第一个计算器需要帮助

    所以我刚刚开始学习编码 已经学习了大约 1 周 我想尝试制作一个可以执行 和 的计算器 但无法弄清楚如何让用户选择他想要使用的内容 有没有人可以帮助我 这是代码 int x int y Console WriteLine Welcome t
  • C++ 中的令牌及其使用方式

    在 Bjarne Stroustrup 的 使用 C 编程原理与实践 一书中 他解释了如何使用标记来阻止 C 自动使用简单计算器上的运算顺序 他在书中给出的代码不起作用 要么是因为我的愚蠢 要么是因为我遗漏了一些东西 我知道令牌本质上是将代
  • 如何知道 jQuery 选项卡上的选项卡是否已启用?

    我在 jQuery UI Tabs 的 API 中找不到 http docs jquery com UI Tabs 一种知道是否启用某个选项卡的方法 我需要它 因为在我的应用程序的事件中 我只想在禁用某个选项卡时才启用该选项卡 你知道如何从
  • 声明 JavaScript 数组时“{}”和“[]”有什么区别?

    声明 JavaScript 数组时 和 有什么区别 通常我声明像 var a 将数组声明为的含义是什么var a 似乎没有人解释数组和对象之间的区别 正在声明一个数组 正在声明一个对象 数组具有对象的所有功能以及附加功能 您可以将数组视为对
  • 使用不同的列/线宽度绘制热图

    我正在模拟一些东西 想找出两个参数的影响 因此 我改变它们 并查找每对参数值的结果 并得到如下结果 0 1000 2000 3000 4000 5000 0 13 2 14 8 19 9 25 5 27 3 1000 21 3 25 9 3
  • 什么时候我们需要多个Dispatcher Servlet?

    哪些场景下我们需要多个Dispatcher Servlets 谁能告诉我的用例multiple Dispatcher Servlets 我认为每个用例都可以通过使用来解决single Dispatcher Servlet 来自文档 Web
  • 由于错误,无法使用特定项目的 gh-pages 进行部署:无法生成 sh:没有这样的文件或目录

    继续报错 错误 无法生成 sh 没有这样的文件或目录 致命 无法分叉 该项目构建正确 但在尝试部署我的网站时失败 网站是在我的 Windows 8 电脑上使用 create react app 使用命令 gh pages d build 创
  • 如何使用图标呈现数据绑定的 WinForms DataGridView 列?

    在我的 C Windows 窗体应用程序中 我有一个DataGridView绑定到一个BindingList
  • 分页链接中重复参数的问题?

    问题是 当我加载第 2 页时 URL 变为 这很好 但是当我翻到第 3 页时 它变成了 依此类推 每次从分页链接加载新页面时 它都会添加一个当前页面参数 我想知道这个问题如何解决 这是分页功能的一些代码 build the paginati
  • 如何在 Rails 6 中使用自定义 jQuery

    我已经思考这个问题好几天了 由于某种原因 我的语义用户界面 jQuery 无法工作 这就是我所做的 在我的 webpack environment js 上 const environment require rails webpacker
  • gridview中的Oracle数据库表

    我想从 Oracle 数据库中的查询中获取结果并将其放入网格视图中 现在我的问题是 我不知道如何在网格视图中输出它 我正在使用工具箱中的 gridview 并且我的 Oracle 连接正常 我也有权利SELECT查询 我可以将其输出到列表框
  • Java 每 0.5 秒在动画中移动 jlabel

    我想要简单的动画每 0 5 秒设置一次位置 但它不会仅在循环结束时设置位置动画 int x 1 整数y 1 while x lt 100 jLabel1 setLocation x y x x 10 y y 10 try Thread sl
  • Flink广播状态如何初始化?

    我们正在尝试构建一个用例 其中来自流的数据通过计算公式运行 但公式本身也应该 很少 可更新 通过阅读文档 在我看来 Flink 广播状态非常适合这种情况 作为实验 我构建了一个简化版本 假设我有一个整数流 以及第二个包含这些整数的乘法因子的
  • 如何将UNC转换为本地路径

    我正在寻找一种方法来获取给定 UNC 路径的相应本地路径 微软提供了一个小型库CheckLCL以此目的 并非所有 Windows 版本都支持此库 有人知道这方面的开源方法吗 还有MAPI功能来自UNC的ScLocalPath 但不确定它是否