2009-02-06 36 views
18

Cách dễ nhất để kiểm tra xem đường dẫn là đường dẫn UNC có phải là để kiểm tra xem ký tự đầu tiên trong đường dẫn đầy đủ có phải là chữ cái hay dấu gạch chéo ngược hay không. Đây có phải là một giải pháp tốt hay có thể có vấn đề với nó?Cách chính xác để kiểm tra xem đường dẫn là đường dẫn UNC hay đường dẫn cục bộ?

Vấn đề cụ thể của tôi là tôi muốn tạo đối tượng System.IO.DriveInfo nếu có ký tự ổ đĩa trong đường dẫn.

Trả lời

13

Vì đường dẫn không có hai dấu gạch chéo ngược ở vị trí thứ nhất và thứ hai là, bằng cách xác định, không phải là đường dẫn UNC, đây là một cách an toàn để đưa ra quyết định này.

Đường dẫn có ký tự ổ đĩa ở vị trí đầu tiên (c :) là đường dẫn cục bộ gốc.

Đường dẫn không có một trong những thứ này (myfolder \ blah) là đường dẫn cục bộ tương đối. Điều này bao gồm một đường dẫn chỉ có một dấu gạch chéo (\ myfolder \ blah).

+0

Bạn nên kiểm tra ít nhất là "\\" để bắt đầu đường dẫn, vì "\ this \ is \ not \ a \ unc \ path" (nó không phải là một điều đặc biệt tốt trong đường dẫn, nhưng nó không phải là UNC bất kể). –

+0

Khá đúng. Tôi đã sửa đổi câu trả lời của mình. – TheSmurf

+1

điều gì về các hệ thống được bản địa hóa trong đó trình tách đường dẫn khác nhau? ví dụ. ¥ trong hệ thống Nhật Bản –

10

Phương pháp chính xác nhất sẽ được sử dụng một số mã interop từ shlwapi.dll

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
[ResourceExposure(ResourceScope.None)] 
[return: MarshalAsAttribute(UnmanagedType.Bool)] 
internal static extern bool PathIsUNC([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath); 

Sau đó bạn sẽ gọi nó là như thế này:

/// <summary> 
    /// Determines if the string is a valid Universal Naming Convention (UNC) 
    /// for a server and share path. 
    /// </summary> 
    /// <param name="path">The path to be tested.</param> 
    /// <returns><see langword="true"/> if the path is a valid UNC path; 
    /// otherwise, <see langword="false"/>.</returns> 
    public static bool IsUncPath(string path) 
    { 
     return PathIsUNC(path); 
    } 

@JaredPar có câu trả lời tốt nhất sử dụng purely managed code.

+0

Hoàn hảo! Cảm ơn rất nhiều – om471987

11

Hãy thử phương pháp mở rộng này

public static bool IsUncDrive(this DriveInfo info) { 
    Uri uri = null; 
    if (!Uri.TryCreate(info.Name, UriKind.Absolute, out uri)) { 
    return false; 
    } 
    return uri.IsUnc; 
} 
+4

Đối tượng DriveInfo không thể được sử dụng cho đường dẫn UNC. Nhưng nếu tôi thay đổi nó thành một phần mở rộng cho DirectoryInfo, và sử dụng FullName thay vì Name, nó có vẻ hoạt động tốt. –

+1

Có lý do nào để không sử dụng 'DirectoryInfo.DriveType == DriveType.Network' thay vì' Uri.TryCreate'? – larsmoa

1

Đây là phiên bản của tôi:

public static bool IsUnc(string path) 
{ 
    string root = Path.GetPathRoot(path); 

    // Check if root starts with "\\", clearly an UNC 
    if (root.StartsWith(@"\\")) 
    return true; 

    // Check if the drive is a network drive 
    DriveInfo drive = new DriveInfo(root); 
    if (drive.DriveType == DriveType.Network) 
    return true; 

    return false; 
} 

Ưu điểm của phiên bản này so với phiên bản @JaredPars là điều này hỗ trợ bất kỳ con đường, không chỉ DriveInfo.

4

Một mẹo nhỏ tôi đã tìm thấy là sử dụng dInfo.FullName.StartsWith(String.Empty.PadLeft(2, IO.Path.DirectorySeparatorChar)) nơi dInfo là một đối tượng DirectoryInfo - nếu kiểm tra mà trả về True thì nó một con đường UNC, nếu đó là một con đường địa phương

+4

Hoặc '.StartsWith (chuỗi mới (Path.DirectorySeparatorChar, 2))'. – jnm2

0

Có lẽ câu trả lời này có thể hữu ích cho những người muốn xác nhận chỉ UNC máy chủ + phần + thư mục con, ví dụ đường dẫn đến mạng lưới kho như

  • \\Server1\Share1
  • \\Server2\Share22\Dir1\Dir2
  • \\Server3

Sử dụng regex sau:

^\\\\([A-Za-z0-9_\-]{1,32}[/\\]){0,10}[A-Za-z0-9_\-]{1,32}$ 
  • thay 32 (2 lần) với tối đa cho phép chiều dài của tên máy chủ/thư mục
  • thay 10 với tối đa cho phép độ sâu đường dẫn (tối đa số lượng thư mục)
  • mở rộng [A-Za-z0-9_\-] (2 lần) nếu bạn là m cho phép một số ký tự được phép trong tên máy chủ/thư mục

Tôi đã thử nghiệm thành công nó. Thưởng thức!

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