2010-10-13 30 views
15

đường dẫn ảo có thể:Trong C#, làm thế nào để bạn kiểm tra xem một đường dẫn là ảo hay không?

/folder1/folder2/image.jpg 
~/folder1/folder2/image.jpg 
folder1/folder2/image.jpg 

bê tông đường dẫn:

C:\folder1\folder2\image.jpg 
D:\folder1\folder2\image.jpg 
C:/folder1/folder2/image.jpg 
C:/folder1\folder2/image.jpg 

Làm thế nào để bạn kiểm tra xem một con đường là ảo hay không theo một cách mà không phải là dễ bị thất bại? Lý do tại sao tôi hỏi là bởi vì khi tôi sử dụng Server.MapPath() trên một con đường cụ thể, nó sẽ ném một ngoại lệ. Tuy nhiên, những gì tôi đang chuyển đến Server.MapPath() có thể là bất kỳ một trong những ví dụ tôi đã cung cấp ở trên và tôi không biết nó là gì trước thời gian chạy.

+1

bạn không thể kiểm tra nếu nó bắt đầu với 'X:'? – BrunoLM

Trả lời

17

này hoạt động tốt đủ cho tôi:

protected string GetPath(string path) 
{ 
    if (Path.IsPathRooted(path)) 
    { 
     return path; 
    } 

    return Server.MapPath(path); 
} 
+3

Điều này sẽ không hoạt động cho '/ folder1/folder2/image.jpg' sẽ trả về' true' – Jimbo

+0

Downvoted vì 'Path.IsPathRooted ("/folder1/folder2/image.jpg ");' trả về 'true' và nó phải có thay vào đó trả về 'false'; –

+0

Thao tác này sẽ hoạt động trong các trường hợp 'một số', nhưng sẽ không thành công cho các đường dẫn bắt đầu bằng "/". – user1751825

1

Tôi sẽ sử dụng Trình phản xạ để kiểm tra xem Server.MapPath() làm gì và thực hiện điều đó. :)

Phương án thay thế có thể là System.IO.Path.GetPathRoot() - nếu nó trả về null thì đó là đường dẫn tương đối. Đây là một chút hack, mặc dù, vì nó không biết bất cứ điều gì về đường dẫn web, vì vậy nếu nó hoạt động nó sẽ làm việc bằng sự trùng hợp ngẫu nhiên.

8

Liệu Path.GetFullPath(string path) có phù hợp với nhu cầu của bạn không? Bạn có thể sử dụng phương pháp đó sau đó so sánh nếu đường dẫn thay đổi.

if (path == Path.GetFullPath(path)) 
{ 
    // This is the full path (no changes) 
} 
else 
{ 
    // This is not the full path i.e. 'virtual' (changes) 
} 

tham khảo: http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx

+0

Tôi mới ở đây và làm cách nào tôi có thể hủy hoạt động của mình? –

1

Lý do tại sao tôi hỏi là bởi vì khi tôi sử dụng Server.MapPath() trên một con đường cụ thể, nó sẽ ném một ngoại lệ

Nó có ném một ngoại lệ cụ thể cho loại tình trạng này, hay nó ném một loại chung? Nếu ngoại lệ là cụ thể cho điều kiện mà đường dẫn đầu vào là cụ thể, tôi sẽ bắt ngoại lệ cụ thể đó trong mã của bạn. Ngay cả khi đó là ngoại lệ chung, tôi vẫn sẽ nhận được ngoại lệ này, bạn có thể không giải mã được nếu nó bị ném vì đường dẫn đầu vào là ảo, nhưng bạn ít nhất có thể viết thông báo ngoại lệ của riêng bạn bao gồm thông báo rằng có thể được gây ra bởi đường dẫn đầu vào là ảo.

Tôi tin rằng đây là giải pháp dễ bị lỗi nhất vì bạn dựa vào việc triển khai Server.MapPath() để xác định các điều kiện mà nó không thành công, thay vì cố gắng tạo một trình bao bọc dư thừa đang cố gắng làm điều tương tự . Trong tương lai, chức năng của MapPath() có thể thay đổi và nó thực sự có thể bắt đầu hỗ trợ đường dẫn ảo, sau đó nó sẽ là ngớ ngẩn rằng bạn có mã để thực sự ngăn chặn việc sử dụng đó.

1

Bạn có thể sử dụng regex sau ...

^(?:[a-zA-Z]:(?:\\|/)|\\\\) 

Nếu bạn muốn đảm bảo rằng bạn luôn có một con đường ánh xạ. Bạn có thể sử dụng một lớp lót sau ...

VB.Net

my_path = If(Regex.IsMatch(my_path, "^(?:[a-zA-Z]:(?:\\|/)|\\\\)"), my_path, Server.MapPath(my_path)) 

C#

my_path = Regex.IsMatch(my_path, @"^(?:[a-zA-Z]:(?:\\|/)|\\\\)") ? my_path : Server.MapPath(my_path); 

này nên làm việc một cách chính xác với đường dẫn ổ đĩa thường xuyên "c: \", cũng như đường dẫn UNC "\\".

0

// Path.IsPathRooted ("/ folder1/folder2/image.jpg"); trả về true

public void Main() 
     { 
      var path = @"/folder1/folder2/image.jpg"; 
      //is valid path? 
      if (!System.IO.Path.GetInvalidPathChars().Any(c => path.Contains(c.ToString()))) 
      { 

       if (IsAbsolutePhysicalPath(path)) 
       { 
        // This is the full path 
       } 
       else 
       { 
        // This is not the full path 
       } 

      } 
     } 
     private bool IsAbsolutePhysicalPath(string path) 
     { 
      if (path == null || path.Length < 3) 
       return false; 

      // e.g c:\foo 
      if (path[1] == ':' && IsDirectorySeparatorChar(path[2])) 
       return true; 

      // e.g \\server\share\foo or //server/share/foo 
      return IsUncSharePath(path); 
     } 
     private bool IsDirectorySeparatorChar(char ch) 
     { 
      return (ch == '\\' || ch == '/'); 
     } 

     private bool IsUncSharePath(string path) 
     { 
      // e.g \\server\share\foo or //server/share/foo 
      if (path.Length > 2 && IsDirectorySeparatorChar(path[0]) && IsDirectorySeparatorChar(path[1])) 
       return true; 
      return false; 

     } 

tham khảo: http://referencesource.microsoft.com/#System.Web/Util/UrlPath.cs,5e5cf20a50a858e2

+0

Điều này có thể được thực hiện dễ dàng hơn nhiều với biểu thức chính quy. Một regex có thể làm chính xác điều tương tự trong 1 dòng. – user1751825

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