代码之家  ›  专栏  ›  技术社区  ›  mem64k

如何将UNC转换为本地路径

  •  1
  • mem64k  · 技术社区  · 15 年前

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

    ScLocalPathFromUNC ,但我不确定它是否能在所有平台上运行。

    2 回复  |  直到 15 年前
        1
  •  4
  •   mem64k    15 年前

    在搜索和挖掘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;
    }
    
        2
  •  -1
  •   Luke Narramore    15 年前

    Uri类可能会有所帮助。

    http://msdn.microsoft.com/en-us/library/system.uri.aspx

    它类似于UNC,并且具有 IsUNC()