简体   繁体   中英

How to pass UNC path from server to client

I have a problem when send a UNC path from server to client.

part of my code from server

if (data == "file")
                        {

                        // Process the data sent by the client.

                            data = String.Format("Request: {0}", data);


                            byte[] mssg = System.Text.Encoding.ASCII.GetBytes(UNCPathing.GetUNCPath(readPath()));

                            // Send back a response.
                            stream.Write(mssg, 0, mssg.Length);
                            bw.ReportProgress(0, String.Format("Sent: {0}", data));
                            bw.ReportProgress(0, String.Format("File path : {0}", mssg));
                        }

if the client sent request "file" the server will send back a path that convert to a UNC path. Z:\\aaaaaaaaaaaa\\file to \\MyServer\\ShareFolder\\File and it's success when convert the path.

But when it's received by the client it's become Z:\\ShareFolder\\File

it's my part of code from client

Int32 bytes = stream.Read(data, 0, data.Length);
            responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
            if (message == "file")
            {
                lstProgress.Items.Add(String.Format("{0}", responseData));
                fPath.getPath = (String.Format("{0}", responseData));
                label4.Text = UNCPathing.GetUNCPath(fPath.getPath);
            }

And it's my UNCPathing.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ServerClientProject
{
public static class UNCPathing
{
    [DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern int WNetGetConnection(
        [MarshalAs(UnmanagedType.LPTStr)] string localName,
        [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName,
        ref int length);
    /// <summary>
    /// Given a path, returns the UNC path or the original. (No exceptions
    /// are raised by this function directly). For example, "P:\2008-02-29"
    /// might return: "\\networkserver\Shares\Photos\2008-02-09"
    /// </summary>
    /// <param name="originalPath">The path to convert to a UNC Path</param>
    /// <returns>A UNC path. If a network drive letter is specified, the
    /// drive letter is converted to a UNC or network path. If the 
    /// originalPath cannot be converted, it is returned unchanged.</returns>
    public static string GetUNCPath(string originalPath)
    {
        StringBuilder sb = new StringBuilder(512);
        int size = sb.Capacity;

        // look for the {LETTER}: combination ...
        if (originalPath.Length > 2 && originalPath[1] == ':')
        {
            // don't use char.IsLetter here - as that can be misleading
            // the only valid drive letters are a-z && A-Z.
            char c = originalPath[0];
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
            {
                int error = WNetGetConnection(originalPath.Substring(0, 2),
                    sb, ref size);
                if (error == 0)
                {
                    DirectoryInfo dir = new DirectoryInfo(originalPath);

                    string path = Path.GetFullPath(originalPath)
                        .Substring(Path.GetPathRoot(originalPath).Length);
                    return Path.Combine(sb.ToString().TrimEnd(), path);
                }
            }
        }

        return originalPath;
    }
}

}

Sorry for my Bad English, Thanks for your attentions

You are receiving a path that uses a mapped drive. See this post for information about retrieving the actual UNC path:

How do I determine a mapped drive's actual path?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM