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());
}
}