C# Window 访问远程路径

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;

namespace Access
{
    public class WNetMap
    {
        [DllImport("mpr.dll")]
        private static extern int WNetAddConnection2A(NETRESOURCE[] lpNetResource, string lpPassword, string lpUserName, int dwFlags);

        [DllImport("mpr.dll")]
        private static extern int WNetCancelConnection2A(string sharename, int dwFlags, int fForce);

        private static int Connect(string remotePath, string localPath, string username, string password)
        {
            NETRESOURCE[] share_driver = new NETRESOURCE[1];
            share_driver[0].dwScope = RESOURCE_SCOPE.RESOURCE_GLOBALNET;
            share_driver[0].dwType = RESOURCE_TYPE.RESOURCETYPE_DISK;
            share_driver[0].dwDisplayType = RESOURCE_DISPLAYTYPE.RESOURCEDISPLAYTYPE_SHARE;
            share_driver[0].dwUsage = RESOURCE_USAGE.RESOURCEUSAGE_CONNECTABLE;
            share_driver[0].lpLocalName = localPath;
            share_driver[0].lpRemoteName = remotePath;

            Disconnect(localPath);
            return WNetAddConnection2A(share_driver, password, username, 1);
        }

        private static int Disconnect(string localpath)
        {
            return WNetCancelConnection2A(localpath, 1, 1);
        }

        public static void WNetAccess(params string[] contents)
        {
            if (contents == null || contents.Length < 1)
                return;

            string[] args = null;
            int ret = -1;
            if (contents.Length > 0)
            {
                args = contents[0].Split(' ');
                if (args.Length > 3)
                {
                    // 0:remotePath, 1:localPath, 2:Username, 3:Password
                    ret = Connect(args[0], args[1], args[2], args[3]);
                    if (ret > 0)
                    {
                        throw new Exception(string.Format("ERROR {0} {1}", ret, (ERROR_ID)ret));
                    }
                }
            }

            if (ret == 0)
            {
                if (contents.Length > 1)
                    Process.Start(contents[1]);
                
                if (contents.Length > 2)
                {
                    var m = Regex.Match(contents[2], @"[\w]+");
                    if (m.Success)
                    {
                        string cmd = m.Groups[0].Value;
                        var dctPrm = GetArgs(contents[2]);
                        if (cmd == "find")
                        {
                            #region find -p -t -w
                            if (Directory.Exists(contents[1]))
                            {
                                DirectoryInfo dir = new DirectoryInfo(contents[1]);
                                List<FileInfo> files = new List<FileInfo>();
                                if (dctPrm.ContainsKey("-p"))
                                    files.AddRange(dir.GetFiles(dctPrm["-p"]));
                                else
                                    files.AddRange(dir.GetFiles());

                                if (dctPrm.ContainsKey("-t"))
                                    files = Find_HandleTimeArg(files, dctPrm["-t"]);

                                if (dctPrm.ContainsKey("-w"))
                                    files = Find_HandleKeyWordArg(files, dctPrm["-w"]);

                                if (dctPrm.ContainsKey("-c"))
                                    System.Windows.Clipboard.SetText(dctPrm["-c"]);

                                foreach (var f in files)
                                    Process.Start(f.FullName);
                            }
                            #endregion
                        }
                    }
                    else
                        throw new Exception("Can't support this action: " + contents[1]);
                }
                Disconnect(args[1]);
            }
        }


        static Dictionary<string, string> GetArgs(string args)
        {
            Dictionary<string, string> pDct = new Dictionary<string, string>();
            string pRex = @"[-][a-zA-Z][\w]*";
            var pNames = Regex.Matches(args, pRex, RegexOptions.Singleline);
            if (pNames.Count > 0)
            {
                var pValues = Regex.Split(args, pRex, RegexOptions.Singleline);
                for (int i = 0; i < pNames.Count; i++)
                {
                    pDct[pNames[i].Value] = pValues[i + 1].Trim();
                }
            }
            return pDct;
        }

        static List<FileInfo> Find_HandleTimeArg(List<FileInfo> files, string arg)
        {
            if (string.IsNullOrEmpty(arg))
                return files;
            List<FileInfo> result = new List<FileInfo>();
            var dt = arg.Split('|');
            DateTime? startDt = null;
            DateTime endDt = DateTime.Now;
            DateTime tmpDt;
            if (dt.Length > 1)
            {
                if (DateTime.TryParse(dt[0].Trim(), out tmpDt))
                    startDt = tmpDt;
                if (DateTime.TryParse(dt[1].Trim(), out tmpDt))
                    endDt = tmpDt;
            }
            else
            { 
                if (DateTime.TryParse(dt[0].Trim(), out tmpDt))
                    endDt = tmpDt;
            }

            FileInfo lastTimeFile = null;
            foreach (var f in files)
            {
                if (startDt.HasValue && f.LastWriteTime >= startDt.Value && f.LastWriteTime < endDt)
                {
                    result.Add(f);
                }
                else if (f.LastWriteTime >= endDt)
                {
                    if (lastTimeFile == null)
                    {
                        lastTimeFile = f;
                        result.Add(f);
                    }
                    else if (lastTimeFile.LastWriteTime > f.LastWriteTime)
                    {
                        result.Remove(lastTimeFile);
                        lastTimeFile = f;
                        result.Add(f);
                    }
                }

            }
            return result;
        }

        static List<FileInfo> Find_HandleKeyWordArg(List<FileInfo> files, string arg)
        {
            if (string.IsNullOrEmpty(arg))
                return files;
            List<FileInfo> result = new List<FileInfo>();
            int line, col; 
            foreach (var f in files)
            {
                line = col = 0;
                using (var sr = f.OpenText())
                {
                    while (sr.Peek() >= 0)
                    {
                        line++;
                        col = sr.ReadLine().IndexOf(arg) + 1;
                        if (col > 0)
                        {
                            result.Add(f);
                            sr.Close();
                            break;
                        }
                    }
                }
            }
            return result;
        }
    }

    #region Define NetWare Connect Class

    public enum ERROR_ID
    {
        ERROR_SUCCESS = 0,  // Success
        ERROR_BUSY = 170,
        ERROR_MORE_DATA = 234,
        ERROR_NO_BROWSER_SERVERS_FOUND = 6118,
        ERROR_INVALID_LEVEL = 124,
        ERROR_ACCESS_DENIED = 5,
        ERROR_INVALID_PASSWORD = 86,
        ERROR_INVALID_PARAMETER = 87,
        ERROR_BAD_DEV_TYPE = 66,
        ERROR_NOT_ENOUGH_MEMORY = 8,
        ERROR_NETWORK_BUSY = 54,
        ERROR_BAD_NETPATH = 53,
        ERROR_NO_NETWORK = 1222,
        ERROR_INVALID_HANDLE_STATE = 1609,
        ERROR_EXTENDED_ERROR = 1208,
        ERROR_DEVICE_ALREADY_REMEMBERED = 1202,
        ERROR_NO_NET_OR_BAD_PATH = 1203,
        ERROR_SESSION_CREDENTIAL_CONFLICT = 1219
    }

    public enum RESOURCE_SCOPE
    {
        RESOURCE_CONNECTED = 1,
        RESOURCE_GLOBALNET = 2,
        RESOURCE_REMEMBERED = 3,
        RESOURCE_RECENT = 4,
        RESOURCE_CONTEXT = 5
    }

    public enum RESOURCE_TYPE
    {
        RESOURCETYPE_ANY = 0,
        RESOURCETYPE_DISK = 1,
        RESOURCETYPE_PRINT = 2,
        RESOURCETYPE_RESERVED = 8,
    }

    public enum RESOURCE_USAGE
    {
        RESOURCEUSAGE_CONNECTABLE = 1,
        RESOURCEUSAGE_CONTAINER = 2,
        RESOURCEUSAGE_NOLOCALDEVICE = 4,
        RESOURCEUSAGE_SIBLING = 8,
        RESOURCEUSAGE_ATTACHED = 16,
        RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
    }

    public enum RESOURCE_DISPLAYTYPE
    {
        RESOURCEDISPLAYTYPE_GENERIC = 0,
        RESOURCEDISPLAYTYPE_DOMAIN = 1,
        RESOURCEDISPLAYTYPE_SERVER = 2,
        RESOURCEDISPLAYTYPE_SHARE = 3,
        RESOURCEDISPLAYTYPE_FILE = 4,
        RESOURCEDISPLAYTYPE_GROUP = 5,
        RESOURCEDISPLAYTYPE_NETWORK = 6,
        RESOURCEDISPLAYTYPE_ROOT = 7,
        RESOURCEDISPLAYTYPE_SHAREADMIN = 8,
        RESOURCEDISPLAYTYPE_DIRECTORY = 9,
        RESOURCEDISPLAYTYPE_TREE = 10,
        RESOURCEDISPLAYTYPE_NDSCONTAINER = 11
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct NETRESOURCE
    {
        public RESOURCE_SCOPE dwScope;
        public RESOURCE_TYPE dwType;
        public RESOURCE_DISPLAYTYPE dwDisplayType;
        public RESOURCE_USAGE dwUsage;

        [MarshalAs(UnmanagedType.LPStr)]
        public string lpLocalName;

        [MarshalAs(UnmanagedType.LPStr)]
        public string lpRemoteName;

        [MarshalAs(UnmanagedType.LPStr)]
        public string lpComment;

        [MarshalAs(UnmanagedType.LPStr)]
        public string lpProvider;
    }

    #endregion
}

 

转载于:https://www.cnblogs.com/geniusliu7/p/10238613.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值