2010-02-28 42 views
13

Phần mềm của tôi xử lý nhiều thao tác trên các tệp và giờ đây tôi đã hoàn thành việc viết các hàm liên quan, sử dụng các lớp System.IO.Làm cách nào để truy cập ổ đĩa mạng thông qua các lớp System.IO thông thường?

Tôi hiện cần thêm hỗ trợ cho các ổ đĩa mạng. Sử dụng ánh xạ hoạt động rất tốt (mặc dù Directory.GetFiles hơi thấp một chút và tôi không biết tại sao), nhưng bây giờ tôi muốn có thể xử lý trực tiếp với các đường dẫn như \\192.168.0.10\Shared Folder\MyDrive. Có cách nào để xử lý loại đường dẫn này ngoài việc gắn ổ đĩa vào một ký tự ổ đĩa có sẵn, bằng cách sử dụng đường dẫn mới được tạo và sau đó ngắt kết nối?

+0

Bạn có gặp sự cố cụ thể không? Không nên có bất cứ điều gì khác mà bạn cần phải làm để xử lý các đường dẫn UNC so với các ổ đĩa được ánh xạ. –

Trả lời

23

Bạn có thể sử dụng đường dẫn UNC (bắt đầu bằng \\) trực tiếp trong đường dẫn của bạn. Tuy nhiên, bạn phải tính đến thông tin đăng nhập cho kết nối này, đây có thể là một phần khó khăn.

Có một số phương pháp:

  1. Nếu remote system đang trên cùng một tên miền hay có một mối quan hệ tin tưởng giữa các lĩnh vực, và người sử dụng chương trình bạn đang chạy như có quyền truy cập thích hợp, nó sẽ " chỉ làm việc ".

  2. Bạn có thể trình bày và thực thi lệnh net use (thông qua chương trình Windows net.exe) để thực hiện kết nối với tên người dùng và mật khẩu cụ thể. Hãy lưu ý rằng kết nối có thể sử dụng được bởi bất kỳ chương trình nào đang chạy trong phiên của người dùng, không chỉ là ứng dụng của bạn. Sử dụng lệnh /DELETE để xóa kết nối khi bạn hoàn tất. Cú pháp điển hình là: net use \\computername\sharename password /USER:domain\username.

  3. Bạn có thể P/Gọi WNetAddConnection2 để hoàn thành cùng một điều như net use mà không cần trục xuất đến net.exe. Bằng cách chuyển NULL thành lpLocalName, không có ký tự ổ đĩa nào được gán, nhưng tên người dùng và mật khẩu sẽ áp dụng cho các truy cập tiếp theo được thực hiện thông qua đường dẫn UNC. Có thể sử dụng chức năng WNetCancelConnection2 để ngắt kết nối.

  4. Bạn có thể P/Gọi LogonUser với cờ LOGON32_LOGON_NEW_CREDENTIALS theo sau là một mạo danh để thêm thông tin đăng nhập từ xa bổ sung vào chuỗi của bạn. Không giống như # 2 và # 3, các hiệu ứng trên toàn bộ phiên của người dùng sẽ bị hạn chế hơn một chút. (Trên thực tế, điều này hiếm khi được thực hiện ủng hộ giải pháp nổi tiếng WNetAddConnection2.)

Sau đây là một ví dụ về cách gọi WNetAddConnection2 từ VB.NET.

Private Sub Test() 
    Dim nr As New NETRESOURCE 
    nr.dwType = RESOURCETYPE_DISK 
    nr.lpRemoteName = "\\computer\share" 
    If WNetAddConnection2(nr, "password", "user", 0) <> NO_ERROR Then 
     Throw New Exception("WNetAddConnection2 failed.") 
    End If 
    'Code to use connection here.' 
    If WNetCancelConnection2("\\computer\share", 0, True) <> NO_ERROR Then 
     Throw New Exception("WNetCancelConnection2 failed.") 
    End If 
End Sub 

<StructLayout(LayoutKind.Sequential)> _ 
Private Structure NETRESOURCE 
    Public dwScope As UInteger 
    Public dwType As UInteger 
    Public dwDisplayType As UInteger 
    Public dwUsage As UInteger 
    <MarshalAs(UnmanagedType.LPTStr)> _ 
    Public lpLocalName As String 
    <MarshalAs(UnmanagedType.LPTStr)> _ 
    Public lpRemoteName As String 
    <MarshalAs(UnmanagedType.LPTStr)> _ 
    Public lpComment As String 
    <MarshalAs(UnmanagedType.LPTStr)> _ 
    Public lpProvider As String 
End Structure 

Private Const NO_ERROR As UInteger = 0 
Private Const RESOURCETYPE_DISK As UInteger = 1 

<DllImport("mpr.dll", CharSet:=CharSet.Auto)> _ 
Private Shared Function WNetAddConnection2(ByRef lpNetResource As NETRESOURCE, <[In](), MarshalAs(UnmanagedType.LPTStr)> ByVal lpPassword As String, <[In](), MarshalAs(UnmanagedType.LPTStr)> ByVal lpUserName As String, ByVal dwFlags As UInteger) As UInteger 
End Function 

<DllImport("mpr.dll", CharSet:=CharSet.Auto)> _ 
Private Shared Function WNetCancelConnection2(<[In](), MarshalAs(UnmanagedType.LPTStr)> ByVal lpName As String, ByVal dwFlags As UInteger, <MarshalAs(UnmanagedType.Bool)> ByVal fForce As Boolean) As UInteger 
End Function 
+0

+1, điều này kỹ lưỡng hơn nhiều so với câu trả lời của tôi. –

+0

Tuyệt vời! Cảm ơn rất nhiều :) CFP. –

3

Sử dụng đường dẫn UNC bình thường như đường dẫn bạn đã đề cập hoạt động hoàn hảo cho tôi. Ví dụ:

string[] dirs = Directory.GetDirectories(@"\\192.168.1.116\"); 

Chỉ hoạt động tốt. Nếu không, bạn có thể có một vấn đề an ninh hoặc một cái gì đó. Trong trường hợp đó, bạn sẽ phải xem xét mạo danh để vượt qua điều đó. Kiểm tra this để biết thêm về mạo danh.

+0

Tuyệt!Trong thực tế, mã của tôi đã có một kiểm tra mà cắt xén ngược ở đầu đường dẫn, gây ra một lỗi khi tôi đã thử này. Cảm ơn! CFP. –

1

Đường dẫn UNC bạn đã đăng (\\192.168.0.10\Shared Folder\MyDrive) là số lẻ. Không có "ổ đĩa", chia sẻ như vậy hoạt động như một thư mục. Bạn sẽ sử dụng Directory.GetFiles(@"\\192.168.0.10\Shared Folder").

Các vấn đề liên quan