C#映射网路驱动器

房东的猫 提交于 2020-04-03 13:14:53

using System.Runtime.InteropServices;
using System.IO;
using System.Text;
class DriveReflection
{
    [StructLayout(LayoutKind.Sequential)]
    public class NetResource
    {
        public int dwScope;
        public int dwType;
        public int dwDisplayType;
        public int dwUsage;
        public string LocalName;
        public string RemoteName;
        public string Comment;
        public string provider;
    }
    [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>
    /// 给定一个路径,返回的网络路径或原始路径。
    /// 例如:给定路径 P:\2008年2月29日(P:为映射的网络驱动器名),可能会返回:“//networkserver/照片/2008年2月9日”
    /// </summary>
    /// <param name="originalPath">指定的路径</param>
    /// <returns>如果是本地路径,返回值与传入参数值一样;如果是本地映射的网络驱动器</returns>
    public static string GetUNCPath(string originalPath)
    {
        StringBuilder sb = new StringBuilder(512);
        int size = sb.Capacity;
        if (originalPath.Length > 2 && originalPath[1] == ':')
        {
            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 = System.IO.Path.GetFullPath(originalPath)
                        .Substring(System.IO.Path.GetPathRoot(originalPath).Length);
                    return System.IO.Path.Combine(sb.ToString().TrimEnd(), path);
                }
            }
        }
        return originalPath;

    }
    [DllImport("mpr.dll", CharSet = CharSet.Ansi)]
    private static extern int WNetAddConnection2(NetResource netResource, string password, string username, int flag);
    [DllImport("mpr.dll", CharSet = CharSet.Ansi)]
    private static extern int WNetCancelConnection2(string lpname, int flag, bool force);
    /// <summary>
    /// 映射网络驱动器
    /// </summary>
    /// <param name="localName">本地盘符 如U:</param>
    /// <param name="remotePath">远程路经 如\\\\172.18.118.106\\f</param>
    /// <param name="userName">远程服务器用户名</param>
    /// <param name="password">远程服务器密码</param>
    /// <returns>true映射成功,false映射失败</returns>
    public static bool WNetReflectDrive(string localName, string remotePath, string userName, string password)
    {
        NetResource netResource = new NetResource();
        netResource.dwScope = 2;
        netResource.dwType = 0x1;
        netResource.dwDisplayType = 3;
        netResource.dwUsage = 1;
        netResource.LocalName = localName;
        netResource.RemoteName = remotePath;
        netResource.provider = null;
        int ret = WNetAddConnection2(netResource, password, userName, 0);
        if (ret == 0)
            return true;
        return false;
    }

    /// <summary>
    /// 断开网路驱动器
    /// </summary>
    /// <param name="lpName">映射的盘符</param>
    /// <param name="flag">true时如果打开映射盘文件夹,也会断开,返回成功 false时打开映射盘文件夹,返回失败</param>
    /// <returns></returns>
    public static bool WNetDisconnectDrive(string lpName, bool flag)
    {
        int ret = WNetCancelConnection2(lpName, 0, flag);
        if (ret == 0)
            return true;
        return false;
    }

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!