C#使用用户名密码连接共享文件夹
创建连接
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);}}}
}
测试
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());}
}