C#使用用户名密码连接共享文件夹

C#使用用户名密码连接共享文件夹

创建连接

csharp 复制代码
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace Tests.ConsoleApp
{
    public class ShareDirectoryConnect : IDisposable
    {
        private static readonly HashSet<Guid> _TOKENS = new HashSet<Guid>();

        private readonly string _username;
        private readonly string _password;
        private readonly string _path;
        private readonly Guid _token = Guid.NewGuid();

        private readonly object _lock = new object();

        public Guid Guid => _token;

        public ShareDirectoryConnect(string path, string username, string password)
        {
            _path = path;
            _username = username;
            _password = password;
            _token = Guid.NewGuid();
            lock (_lock)
            {
                if (_TOKENS.Count == 0)
                    Initalize();
                _TOKENS.Add(_token);
            }
        }

        public static ShareDirectoryConnect Connect(string path, string username, string password)
        {
            return new ShareDirectoryConnect(path, username, password);
        }

        private void Initalize()
        {
            USE_INFO_2 useInfo = new USE_INFO_2
            {
                ui2_remote = _path,
                ui2_username = _username,
                ui2_password = _password,
                ui2_domainname = string.Empty,
                ui2_asg_type = 0,
                ui2_usecount = 1
            };
            int result = NetUseAdd(null, 2, ref useInfo, out int paramError);
            if (result != 0)
                throw new Win32Exception(result);
        }


        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct USE_INFO_2
        {
            public string ui2_local;
            public string ui2_remote;
            public string ui2_password;
            public int ui2_status;
            public int ui2_asg_type;
            public int ui2_refcount;
            public int ui2_usecount;
            public string ui2_username;
            public string ui2_domainname;
        }

        [DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
        private static extern int NetUseAdd(
            string uncServerName,
            int level,
            ref USE_INFO_2 buf,
            out int paramError);

        [DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
        private static extern int NetUseDel(
            string uncServerName,
            string useName,
            int forceCond);

        public void Dispose()
        {
            lock (_lock)
            {
                if (_TOKENS.Contains(_token))
                    _TOKENS.Remove(_token);
                if (_TOKENS.Count == 0)
                    NetUseDel(null, _path, 2);
            }
        }
    }
}

测试

csharp 复制代码
internal class Program
{
    private static readonly string _username = "连接用户名";
    private static readonly string _password = "连接密码";
    private static readonly string _path = @"\\192.168.190.123\共享文件夹";
    static void Main(string[] args)
    {
        string testDir = _path + @"\test0328";
        using (ShareDirectoryConnect.Connect(_path, _username, _password))
        {
            Directory.CreateDirectory(testDir);
            Console.WriteLine("Created directory!");
        }
        List<Task> tasks = new List<Task>();
        for (int i = 0; i < 20; i++)
        {
            Task task = Task.Run(() =>
            {
                for (int j = 0; j < 5; j++)
                {
                    using (ShareDirectoryConnect.Connect(_path, _username, _password))
                    {
                        File.WriteAllText(testDir + "\\" + Guid.NewGuid().ToString() + ".txt", "Hello World");
                        Console.WriteLine("Created file!");
                    }
                }
            });
            tasks.Add(task);
        }
        Task.WaitAll(tasks.ToArray());
    }
}
相关推荐
江山如画,佳人北望1 小时前
C#程序入门
开发语言·windows·c#
AustinCyy1 小时前
【环境配置】Neo4j Community Windows 安装教程
windows·neo4j
与火星的孩子对话2 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
奇怪的杰哥2 小时前
Win11 加快软件开机自启动
windows
future14122 小时前
C#每日学习日记
java·学习·c#
cpsvps2 小时前
Windows内核并发优化
windows
军训猫猫头5 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
qq_393828228 小时前
电脑休眠设置
windows·电脑·软件需求
网安小白的进阶之路11 小时前
A模块 系统与网络安全 第三门课 网络通信原理-3
网络·windows·安全·web安全·系统安全
芳草萋萋鹦鹉洲哦18 小时前
【vue3+tauri+rust】如何实现下载文件mac+windows
windows·macos·rust