2011-08-10 20 views
6

Sử dụng C#, tôi muốn ứng dụng của mình trả lại thư mục (có đường dẫn đã biết) nằm trong mạng hay trong máy tính của tôi.Sử dụng C#, cách biết thư mục nằm trên mạng hay không

Tôi có thể làm như thế nào?

+1

Bạn có yêu cầu về đường dẫn UNC? Điều gì về '\\ localhost \ something', hoặc một ổ đĩa mạng được ánh xạ? – SLaks

+3

có thể trùng lặp của [Kiểm tra nếu đường dẫn trên mạng] (http://stackoverflow.com/questions/2243569/check-if-path-is-on-network) –

+0

Đối với cả hai trường hợp, đường dẫn UNC và ổ đĩa mạng được ánh xạ. – MyrR

Trả lời

6

Nếu bạn đang nói về một ổ đĩa mạng được ánh xạ, bạn có thể sử dụng 's DriveType propertyDriveInfo:

var driveInfo = new DriveInfo("S:\"); 
if(driveInfo.DriveType == DriveType.Network) 
    // do something 
0
var dirInfo = new DirectoryInfo(yourPath); 
var driveInfo = new DriveInfo(dirInfo.Root); 
if (driveInfo.DriveType == DriveType.Network) 
    Console.WriteLine("Is a network drive!"); 
+0

Làm việc cho đường dẫn cục bộ và đường dẫn mạng được ánh xạ nhưng không phải đường dẫn UNC – Jamiec

0

Hãy thử như sau từ Shell Lightweight Utility API:

class Class 
{ 
    [DllImport("shlwapi.dll")] 
    private static extern bool PathIsNetworkPath(string Path); 

    [STAThread] 
    static void Main(string[] args) 
    { 
     string strPath = "D:\\Temp\\tmpfile.txt"; 
     bool blnIsLocalPath = IsLocalPath(strPath); 
     Console.WriteLine(blnIsLocalPath.ToString()); 
     Console.ReadLine(); 
    } 

    private static bool IsLocalPath(string Path) 
    { 
     return !PathIsNetworkPath(Path); 
    } 
} 

Những điều cần xem xét:

  • Paths mà cam kết với hai ký tự dấu chéo ngược (\) được hiểu là đường dẫn Quy ước Đặt tên Chung (UNC).
  • Đường dẫn bắt đầu bằng một chữ cái theo sau dấu hai chấm (:) được hiểu là ổ đĩa mạng được gắn kết. Tuy nhiên, PathIsNetworkPath không thể nhận dạng ổ đĩa mạng được ánh xạ tới ký tự ổ đĩa thông qua lệnh Microsoft MS-DOS SUBST hoặc hàm DefineDosDevice
0

Bạn có thể sử dụng phương pháp folowing để lấy đường dẫn UNC cho một thư mục. Không chính xác những gì bạn đang tìm kiếm nhưng có thể có ích

public static string GetUniversalPath(string folderPath) 
    { 
     if (String.IsNullOrEmpty(folderPath) || folderPath.IndexOf(":") > 1) 
      return folderPath; 

     if (folderPath.StartsWith("\\")) 
     { 
      return folderPath; 
     } 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT RemoteName FROM win32_NetworkConnection WHERE LocalName = '" + folderPath.Substring(0, 2) + "'"); 
     foreach (ManagementObject managementObject in searcher.Get()) 
     { 
      string remoteName = managementObject["RemoteName"] as String; 
      if (!String.IsNullOrEmpty(remoteName)) 
      { 
       remoteName += folderPath.Substring(2); 
       return remoteName; 
      }    
     } 
     return folderPath; 
    } 
3

Dựa trên @jgauffin và @Daniel câu trả lời, bạn có thể thử ít hack này:

private static bool IsNetwork(String path) 
{ 
    if (path.StartsWith(@"\\")) 
     return true; 
    var dir = new DirectoryInfo(path); 
    var drive = new DriveInfo(dir.Root.ToString()); 
    return drive.DriveType == DriveType.Network; 
} 
+0

Đây là giải pháp duy nhất bao gồm đường dẫn mạng UNC và ánh xạ. Đủ tôt cho tôi. – NielW

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