C#如何去連接網絡共享目錄

david0620 2008-12-05 10:43:03
在C#的(Winfrom或WEB)中如何去連接網絡上共享的目錄呢?
...全文
1369 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyjimi 2008-12-10
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace WindowsApplication1
{
#region Windows API enum and struct
public enum ERROR_ID
{
ERROR_SUCCESS = 0, // Success
ERROR_MORE_DATA = 234,
ERROR_NO_BROWSER_SERVERS_FOUND = 6118,
ERROR_INVALID_LEVEL = 124,
ERROR_ACCESS_DENIED = 5,
ERROR_INVALID_PARAMETER = 87,
ERROR_NOT_ENOUGH_MEMORY = 8,
ERROR_NETWORK_BUSY = 54,
ERROR_BAD_NETPATH = 53,
ERROR_NO_NETWORK = 1222,
ERROR_INVALID_HANDLE_STATE = 1609,
ERROR_EXTENDED_ERROR = 1208
}

public enum RESOURCE_SCOPE
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET = 2,
RESOURCE_REMEMBERED = 3,
RESOURCE_RECENT = 4,
RESOURCE_CONTEXT = 5
}

public enum RESOURCE_TYPE
{
RESOURCETYPE_ANY = 0,
RESOURCETYPE_DISK = 1,
RESOURCETYPE_PRINT = 2,
RESOURCETYPE_RESERVED = 8,
}

public enum RESOURCE_USAGE
{
RESOURCEUSAGE_CONNECTABLE = 1,
RESOURCEUSAGE_CONTAINER = 2,
RESOURCEUSAGE_NOLOCALDEVICE = 4,
RESOURCEUSAGE_SIBLING = 8,
RESOURCEUSAGE_ATTACHED = 16,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
}

public enum RESOURCE_DISPLAYTYPE
{
RESOURCEDISPLAYTYPE_GENERIC = 0,
RESOURCEDISPLAYTYPE_DOMAIN = 1,
RESOURCEDISPLAYTYPE_SERVER = 2,
RESOURCEDISPLAYTYPE_SHARE = 3,
RESOURCEDISPLAYTYPE_FILE = 4,
RESOURCEDISPLAYTYPE_GROUP = 5,
RESOURCEDISPLAYTYPE_NETWORK = 6,
RESOURCEDISPLAYTYPE_ROOT = 7,
RESOURCEDISPLAYTYPE_SHAREADMIN = 8,
RESOURCEDISPLAYTYPE_DIRECTORY = 9,
RESOURCEDISPLAYTYPE_TREE = 10,
RESOURCEDISPLAYTYPE_NDSCONTAINER = 11
}

[StructLayout(LayoutKind.Sequential)]
public struct NETRESOURCE
{
public RESOURCE_SCOPE dwScope;
public RESOURCE_TYPE dwType;
public RESOURCE_DISPLAYTYPE dwDisplayType;
public RESOURCE_USAGE dwUsage;

[MarshalAs(UnmanagedType.LPStr)]
public string lpLocalName;

[MarshalAs(UnmanagedType.LPStr)]
public string lpRemoteName;

[MarshalAs(UnmanagedType.LPStr)]
public string lpComment;

[MarshalAs(UnmanagedType.LPStr)]
public string lpProvider;
}

#endregion


/**//// <summary>
/// 连接网络上的共享文件夹
/// </summary>
public class NetworkSharedFolder
{

[DllImport("mpr.dll")]
public static extern int WNetAddConnection2A(NETRESOURCE[] lpNetResource, string lpPassword, string lpUserName, int dwFlags);

[DllImport("mpr.dll")]
public static extern int WNetCancelConnection2A(string sharename, int dwFlags, int fForce);


public static int Connect(string remotePath, string localPath, string username, string password)
{
NETRESOURCE[] share_driver = new NETRESOURCE[1];
share_driver[0].dwType = RESOURCE_TYPE.RESOURCETYPE_DISK;
share_driver[0].lpLocalName = localPath;
share_driver[0].lpRemoteName = remotePath;

Disconnect(localPath);
int ret = WNetAddConnection2A( share_driver, password, username, 1);

return ret;
}

public static void Disconnect(string localpath)
{
WNetCancelConnection2A(localpath, 1, 1);
}

public static void Test()
{
int ret = NetworkSharedFolder.Connect(@"\\192.168.1.2\log", @"Y:", "user1", "user1");
System.Console.WriteLine("connect ret = " + ret);
}
}
}

david0620 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zgke 的回复:]
使用 NET USE 来保存用户和密码 .NET下就可以直接访问了

http://blog.csdn.net/zgke/archive/2008/12/05/3451599.aspx
[/Quote]

你這個還是用net use,我知道調用Process是可以實現批處理的功能啦,但是我不想用這個
WNetadd Connection2怎麼實現
david0620 2008-12-05
  • 打赏
  • 举报
回复
有誰看一下我的代碼,是哪裡有問題啊?
david0620 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kugou123 的回复:]
C# 里面调用cmd去执行 net use ****的命令建立IPC连接。
然后可以映射成为一个本地盘符。这样就可以像操作本地盘一样去操作远程映射目录了。
[/Quote]
net use 不是我想要的
zgke 2008-12-05
  • 打赏
  • 举报
回复
使用 NET USE 来保存用户和密码 .NET下就可以直接访问了

http://blog.csdn.net/zgke/archive/2008/12/05/3451599.aspx
david0620 2008-12-05
  • 打赏
  • 举报
回复
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
[DllImport("mpr.dll", EntryPoint="WNetAddConnection2")]
private static extern uint WNetAddConnection2(
[In] NETRESOURCE lpNetResource,
string lpPassword,
string lpUsername,
uint dwFlags);


[DllImport("Mpr.dll")]
private static extern uint WNetCancelConnection2(
string lpName,
uint dwFlags,
bool fForce);

[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public int dwScope;
public int dwType;
public int dwDisplayType;
public int dwUsage;
public string LocalName;
public string RemoteName;
public string Comment;
public string Provider;
}


private void Page_Load(object sender, System.EventArgs e)
{
// 在這裡放置使用者程式碼以初始化網頁
}

#region Web Form 設計工具產生的程式碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 此為 ASP.NET Web Form 設計工具所需的呼叫。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 此為設計工具支援所必須的方法 - 請勿使用程式碼編輯器修改
/// 這個方法的內容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
NETRESOURCE myNetResource = new NETRESOURCE();
myNetResource.dwScope = 2; //2:RESOURCE_GLOBALNET
myNetResource.dwType = 1 ; //1:RESOURCETYPE_ANY
myNetResource.dwDisplayType = 3; //3:RESOURCEDISPLAYTYPE_GENERIC
myNetResource.dwUsage = 1; //1: RESOURCEUSAGE_CONNECTABLE
myNetResource.LocalName = "Y:";
myNetResource.RemoteName = @"\\ftp\temp\";
myNetResource.Provider = null;

uint nret = WNetAddConnection2( myNetResource, "user", "pwd", 0);
if(nret==0)
{
Response.Write("0");
}

}


為什麼我這樣還是不能將Y:映射出來啊
kugou123 2008-12-05
  • 打赏
  • 举报
回复
C# 里面调用cmd去执行 net use ****的命令建立IPC连接。
然后可以映射成为一个本地盘符。这样就可以像操作本地盘一样去操作远程映射目录了。
flyjimi 2008-12-05
  • 打赏
  • 举报
回复
使用win32 api

[DllImport("mpr.dll")]
public static extern int WNetAddConnection2A(NETRESOURCE[] lpNetResource, string lpPassword, string lpUserName, int dwFlags);

[DllImport("mpr.dll")]
public static extern int WNetCancelConnection2A(string sharename, int dwFlags, int fForce);
public static int Connect(string remotePath, string localPath, string username, string password)
{
NETRESOURCE[] share_driver = new NETRESOURCE[1];
share_driver[0].dwType = RESOURCE_TYPE.RESOURCETYPE_DISK;
share_driver[0].lpLocalName = localPath;
share_driver[0].lpRemoteName = remotePath;

Disconnect(localPath);
int ret = WNetAddConnection2A(share_driver, password, username, 1);

return ret;
}

public static void Disconnect(string localpath)
{
WNetCancelConnection2A(localpath, 1, 1);
}

david0620 2008-12-05
  • 打赏
  • 举报
回复
我在C#下實現,有代碼沒
jackljane 2008-12-05
  • 打赏
  • 举报
回复
网络上共享的目录如果权限比较低。在winform是里可以直接当作本地盘去操作的。如果有设有账号密码。则在代码里运行 cmd 执行net use 命令。把用户名密码作为参数打通路径之后再操作。
b/s里无法访问共享。因为结构不一样。客户在ie访问的时候根本就没有这个环境。你只能把服务器的局域网环境里的文件取过来放在iis目录下。或用网址访问
enihs 2008-12-05
  • 打赏
  • 举报
回复
将网络路径映射为本地的一个虚拟盘
然后就按操作本机文件一样操作这个文件就可以了
tianshangfei 2008-12-05
  • 打赏
  • 举报
回复
oo
basaka1982 2008-12-05
  • 打赏
  • 举报
回复
做个记号
david0620 2008-12-05
  • 打赏
  • 举报
回复
報說沒有using NETRESOURCE
david0620 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 flyjimi 的回复:]
引用 7 楼 david0620 的回复:
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
[DllImport("mpr.dll", EntryPoint="WNetAddConnection2")]
private static extern uint WNetAddConnection2(
[In] NETRESOURCE lpNetResource,
string lpPassword,
string lpUsername,
uint dwFlags);


[DllImport("Mpr.dll")]
private static extern uint WNetCancel…
[/Quote]

用你的代碼報錯:
[DllImport("mpr.dll")]
public static extern int WNetAddConnection2A( NETRESOURCE[] lpNetResource, string lpPassword, string lpUserName, int dwFlags);

[DllImport("mpr.dll")]
public static extern int WNetCancelConnection2A(string sharename, int dwFlags, int fForce);
NETRESOURCE[] share_driver = new NETRESOURCE[1];
share_driver[0].dwType = RESOURCE_TYPE.RESOURCETYPE_DISK;
share_driver[0].lpLocalName = localPath;
share_driver[0].lpRemoteName = remotePath;

Disconnect(localPath);
int ret = WNetAddConnection2A(@"serverip\temp", "pwd", "user", 1);

return ret;
zlb789 2008-12-05
  • 打赏
  • 举报
回复
up
david0620 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 flyjimi 的回复:]
引用 7 楼 david0620 的回复:
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
[DllImport("mpr.dll", EntryPoint="WNetAddConnection2")]
private static extern uint WNetAddConnection2(
[In] NETRESOURCE lpNetResource,
string lpPassword,
string lpUsername,
uint dwFlags);


[DllImport("Mpr.dll")]
private static extern uint WNetCancel…
[/Quote]

怎麼我用你的代碼還是不行啊?
你看看我的代碼看看哪裡有問題?
指點一下..
flyjimi 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 david0620 的回复:]
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
[DllImport("mpr.dll", EntryPoint="WNetAddConnection2")]
private static extern uint WNetAddConnection2(
[In] NETRESOURCE lpNetResource,
string lpPassword,
string lpUsername,
uint dwFlags);


[DllImport("Mpr.dll")]
private static extern uint WNetCancelConnection2(
string lpName,
uint dwFl…
[/Quote]

我在5楼贴的
[DllImport("mpr.dll")]
public static extern int WNetAddConnection2A(NETRESOURCE[] lpNetResource, string lpPassword, string lpUserName, int dwFlags);
调用时需要传入的是一个数组类型,你把传入类型给改了。
我本地又试了一下可以映射上的。

NETRESOURCE[] share_driver = new NETRESOURCE[1];
share_driver[0].dwType = RESOURCE_TYPE.RESOURCETYPE_DISK;
share_driver[0].lpLocalName = localPath;
share_driver[0].lpRemoteName = remotePath;

int ret = WNetAddConnection2A( share_driver, password, username, 1);
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 本文主要介绍了如何使用C#访问网络共享文件夹,具有一定的参考价值。通过本文,读者可以掌握C#中访问网络共享文件夹的具体实现方法,包括枚举类型的定义、结构体的声明以及如何使用NETRESOURCE结构体等内容。 在C#中,枚举类型可用于定义一组命名常量,本文定义了多个枚举类型,如ERROR_ID、RESOURCE_SCOPE、RESOURCE_TYPE、RESOURCE_USAGE和RESOURCE_DISPLAYTYPE等,这些枚举类型用于描述网络共享文件夹的状态和属性。结构体则用于定义一组相关变量,本文声明了NETRESOURCE结构体,其中包含dwScope、dwType、dwDisplayType和dwUsage等字段,用于描述网络共享文件夹的属性。在使用NETRESOURCE结构体时,需了解MarshalAsAttribute的用法,它是一个特性,用于指定如何将托管类型转换为非托管类型。本文中,通过使用MarshalAsAttribute将NETRESOURCE结构体的dwDisplayType字段指定为UnmanagedType.LPStr类型。 访问网络共享文件夹时,可使用WNetAddConnection2函数连接到网络共享文件夹。该函数需要传入网络共享文件夹路径、用户名和密码等参数。通过调用此函数,可以成功连接到网络共享文件夹并访问其中的文件和文件夹。 本文详细介绍了C#访问网络共享文件夹的方法,包括枚举类型定义、结构体声明、NETRESOURCE结构体使用等内容。读者可以参考本文中的代码实现自己的项目。本文涉及的知识点包括:枚举类型定义、结构体声明、NETRESOURCE结构体使用、MarshalAsAttribute使用、WNetAddConnection2函数使用

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧