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());
    }
}
相关推荐
zhangfeng113318 小时前
Windows 的 Git Bash 中使用 md5sum 命令非常简单 md5做文件完整性检测 WinRAR 可以计算文件的 MD5 值
人工智能·windows·git·bash
FL162386312918 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#
彭波39619 小时前
.NET Framework 3.5问题修复教程!可以离线修复
windows·安全·电脑·.net·开源软件
love530love20 小时前
OpenClaw 手机直连配置全流程
人工智能·windows·python·智能手机·c#·agent·openclaw
bcbobo21cn21 小时前
C# byte类型和byte数组的使用
开发语言·c#·字节数组·byte类型
月巴月巴白勺合鸟月半1 天前
一次PDF文件的处理(一)
pdf·c#
AnalogElectronic1 天前
windows递归遍历当前目录下文件并重命名程序
windows
web3.08889991 天前
taoxi商品详情|商品属性|包装规格信息 API接口
windows
大鹏说大话1 天前
Java 锁膨胀机制深度解析:从偏向锁到重量级锁的进化之路
开发语言·c#
新手88601 天前
Oracle VirtualBox虚拟机安装 和 安装 window11版本虚拟机 及 启用EFI和硬盘无法使用 问题
服务器·windows·计算机网络·安全·虚拟机