业务背景:
有时需要在用c#写的web服务或winform中访问网络盘上面的文件,需要用c#代码手动创建网盘。
方法:
用win api来实现连接网络盘,如果是在iis下面的web服务所连接的网盘,读写权限在iis下面有权访问,并且在windows下面
是不可见的。如果是在win下面所创建的在iis下面是没有权限访问题,下面就是原码。
1 先创建一个网盘的类文件WNetHelper
using System.Runtime.InteropServices;
using System.IO;
using System;
public class WNetHelper
{
[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")]
private static extern uint WNetAddConnection2(NetResource lpNetResource, string lpPassword, string lpUsername, uint dwFlags);
[DllImport("Mpr.dll", EntryPoint = "WNetCancelConnection2")]
private static extern uint WNetCancelConnection2(string lpName, uint dwFlags, bool fForce);
[StructLayout(LayoutKind.Sequential)]
public class NetResource
{
public int dwScope;
public int dwType;
public int dwDisplayType;
public int dwUsage;
public string lpLocalName;
public string lpRemoteName;
public string lpComment;
public string lpProvider;
}
/// <summary>
/// 为网络共享做本地映射
/// </summary>
/// <param name="username">访问用户名(windows系统需要加计算机名,如:comp-1/user-1)</param>
/// <param name="password">访问用户密码</param>
/// <param name="remoteName">网络共享路径(如://192.168.0.9/share)</param>
/// <param name="localName">本地映射盘符</param>
/// <returns></returns>
public static uint WNetAddConnection(string username, string password, string remoteName, string localName)
{
NetResource netResource = new NetResource();
netResource.dwScope = 2;
netResource.dwType = 1;
netResource.dwDisplayType = 3;
netResource.dwUsage = 1;
netResource.lpLocalName = localName;
netResource.lpRemoteName = remoteName.TrimEnd('/');
uint result = WNetAddConnection2(netResource, password, username, 0);
return result;
}
public static uint WNetCancelConnection(string name, uint flags, bool force)
{
uint nret = WNetCancelConnection2(name, flags, force);
return nret;
}
}
2 调用创建网盘示例
string picturePath1 = "";
string picturePath2 = "";
string NetRoot = "";
string NetPath = "";
string NetUser = "";
string NetPSW = "";
uint state = 0;
NetRoot = ConfigurationManager.ConnectionStrings["NetRoot"].ConnectionString;
NetPath = ConfigurationManager.ConnectionStrings["NetPath"].ConnectionString;
NetUser = ConfigurationManager.ConnectionStrings["NetUser"].ConnectionString;
NetPSW = ConfigurationManager.ConnectionStrings["NetPSD"].ConnectionString;
picturePath1 = ConfigurationManager.ConnectionStrings["PicturePath1"].ConnectionString;
picturePath2 = ConfigurationManager.ConnectionStrings["PicturePath2"].ConnectionString;
if (!Directory.Exists(NetRoot))
{
//WNetHelper.WNetAddConnection(@"计算机名称\登录账户", "登录密码", @"映射路径", @"映射盘符名称");
state = WNetHelper.WNetAddConnection(NetUser, NetPSW, NetPath, NetRoot);
}
if (state.Equals(0))
{
}
else
{
Console.WriteLine("添加网络驱动器错误,错误号:" + state.ToString());
}
3 网盘建好后,就同本地盘一样的方法进行访问了。测试函数:
public string A_TEST_A(string file)
{
string filepath = picturePath1 + file + ".jpg";
if (File.Exists(filepath))
{
return filepath+"文件存在";
}
else
{
filepath = picturePath2 + file + ".jpg";
if (File.Exists(filepath))
{
return filepath + "文件存在";
}
else
return filepath+"文件不存在";
}
}