2010-06-18 67 views
36

Tôi muốn biết cách xác định chuỗi là đường dẫn tệp hợp lệ hay không.Xác định qua C# xem chuỗi có phải là đường dẫn tệp hợp lệ

Đường dẫn tệp có thể hoặc có thể không tồn tại.

+1

Bạn có nói rằng bạn có một chuỗi trông giống như một con đường, và có hoặc không có tập tin thực sự tồn tại, bạn muốn biết nếu một tập tin tại "đường dẫn" cho có thể tồn tại? Nếu đường dẫn hợp lệ, ngay cả khi không có tệp tại vị trí đó? – SqlRyan

+0

có thể trùng lặp của [Làm thế nào kiểm tra nếu chuỗi được cho là tên tập tin hợp pháp (được phép) trong Windows?] (Http://stackoverflow.com/questions/62771/how-check-if-given-string-is-legal-allowed- tập tin tên-dưới-windows) – nawfal

+0

Nếu quan tâm của bạn thường kiểm tra xem chuỗi có thể biểu diễn một tệp *** hoặc *** một thư mục hay không, hãy xem [câu trả lời này] (http://stackoverflow.com/a/3137165/1497596) hoặc [câu trả lời liên quan này] (http://stackoverflow.com/a/41049011/1497596). – DavidRR

Trả lời

18

Một kiểm tra chính xác 100% của định dạng chuỗi của một con đường là khá khó khăn, vì nó sẽ phụ thuộc vào hệ thống tập tin mà trên đó nó được sử dụng (và các giao thức mạng nếu nó không nằm trên cùng một máy tính).

Ngay cả trong các cửa sổ hoặc thậm chí NTFS của nó không đơn giản vì nó vẫn phụ thuộc vào API .NET đang sử dụng trong nền để giao tiếp với hạt nhân.

Và vì hầu hết các hệ thống tập tin hiện nay unicode hỗ trợ, người ta cũng có thể cần phải kiểm tra tất cả các quy tắc cho unicode correcly mã hóa, chuẩn hóa, vv vv

Những gì tôi muốn làm là làm cho chỉ một số kiểm tra cơ bản, và sau đó xử lý các ngoại lệ đúng cách khi đường dẫn được sử dụng. Đối với quy tắc có thể thấy:

+0

wikipedia của nó;) – atamanroman

+1

:-) cảm ơn fielding, cố định nó. – Stefan

44

Bạn có thể sử dụng hàm tạo FileInfo. Nó sẽ ném một ArgumentException nếu "Tên tệp trống, chỉ chứa các khoảng trắng hoặc chứa các ký tự không hợp lệ". Nó cũng có thể ném SecurityException hoặc UnauthorizedAccessException, mà tôi nghĩ bạn có thể bỏ qua nếu bạn chỉ quan tâm đến định dạng.

Tùy chọn khác là kiểm tra trực tiếp Path.GetInvalidPathChars. Ví dụ:

boolean possiblePath = pathString.IndexOfAny(Path.GetInvalidPathChars()) == -1; 
+3

FWIW, điều này sẽ trả về kết quả dương tính giả. Bạn cũng sẽ cần phải kiểm tra quyền và thư mục/tên tệp không phải là một trong những thư mục bất hợp pháp (http://en.wikipedia.org/wiki/DOS#Reserved_device_names). –

+0

'FileInfo mới (" test ")' là hoàn toàn hợp lệ, nhưng không phải là một tệp. – Julien

+1

@Julien Nếu bạn không vượt qua một đường dẫn đầy đủ, nó sẽ coi nó như là một đường dẫn tương đối từ bất kỳ thứ gì được trả về bởi 'Directory.GetCurrentDirectory()'. Vì vậy, nếu bạn đang làm việc trong 'C: \ Temp' và bạn gọi' new FileInfo ("test"); ', thuộc tính' FullName' sẽ là 'C: \ Temp \ test'. – tehDorf

2

Bạn đã thử biểu thức chính quy chưa?

^([a-zA-Z]\:)(\\[^\\/:*?<>"|]*(?<![ ]))*(\.[a-zA-Z]{2,6})$ 

nên làm việc

+1

Ông không bao giờ nói con đường tuyệt đối, không có giới hạn để tập tin chiều dài mở rộng, và đó không phải là di động. –

+39

Một số người, khi đối mặt với một vấn đề, hãy nghĩ rằng "Tôi biết, tôi sẽ sử dụng các biểu thức thông thường." Bây giờ họ có hai vấn đề. -Jamie Zawinski – womp

0

Tôi thấy điều này ở regexlib.com (http://regexlib.com/REDetails.aspx?regexp_id=345) bởi Dmitry Borysov .

"File Name Validator xác nhận cả hai UNC (\ server \ share \ tập tin) và đường dẫn MS thông thường. (C: \ tập tin)"

^(([a-zA-Z]:|\\)\\)?(((\.)|(\.\.)|([^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?))\\)*[^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?$ 

Run nó với một Regex.IsMatch và bạn sẽ nhận được một bool chỉ ra nếu nó hợp lệ hay không. Tôi nghĩ rằng biểu thức chính quy là cách để đi vì tệp có thể không tồn tại.

0

Lớp tĩnh System.IO.Path có thể làm những gì bạn đang yêu cầu.

8

Dưới đây là một số điều bạn có thể sử dụng:

  • để kiểm tra xem ổ đĩa là đúng (ví dụ trên một máy tính ổ X: \ tồn tại, nhưng không phải trên của bạn): sử dụng Path.IsPathRooted để xem nếu nó là không phải là đường dẫn tương đối và sau đó sử dụng các ổ đĩa từ Environment.GetLogicalDrives() để xem đường dẫn của bạn có chứa một trong các ổ đĩa hợp lệ hay không.
  • Để kiểm tra các ký tự hợp lệ, bạn có hai phương pháp: Path.GetInvalidFileNameChars()Path.GetInvalidPathChars() không trùng lặp hoàn toàn.Bạn cũng có thể sử dụng Path.GetDirectoryName(path)Path.GetFileName(fileName) với tên đầu vào của bạn, mà sẽ throw an exception nếu tham số

Đường dẫn chứa các ký tự không hợp lệ, là trống rỗng, hoặc chỉ chứa khoảng trắng.

3

Bạn thực sự không thể chắc chắn cho đến khi bạn cố gắng tạo tệp đó. Có thể đường dẫn là hợp lệ nhưng cài đặt bảo mật sẽ không cho phép tạo tệp. Ví dụ duy nhất có thể cho bạn biết nếu đường dẫn là REALLY hợp lệ sẽ là hệ điều hành, vậy tại sao bạn không cố gắng tạo tập tin đó bắt IOException mà chỉ ra một cái gì đó đã đi thực sự sai? Imho đây là cách tiếp cận dễ dàng hơn: giả sử đầu vào là hợp lệ và làm điều gì đó nếu nó không phải là, thay vì làm nhiều công việc không cần thiết.

0

Bạn chỉ có thể sử dụng Path.Combine() bên trong một câu lệnh try catch:

string path = @" your path "; 
try 
{ 
    Path.Combine(path); 
} 
catch 
{ 
    MessageBox.Show("Invalid path"); 
} 

Edit: Lưu ý rằng chức năng này không ném một ngoại lệ nếu đường dẫn chứa ký tự đại diện ('*' và '?') vì chúng có thể được sử dụng trong các chuỗi tìm kiếm.

+0

Điều này thực sự không bắt khi đường dẫn của tôi là "một cái gì đó bất hợp pháp" – MichaelvdNet

1

Hãy thử phương pháp này sẽ cố gắng đề cập đến tất cả các trường hợp ngoại lệ có thể xảy ra. Nó sẽ làm việc cho hầu như tất cả các đường dẫn liên quan đến Windows.

/// <summary> 
/// Validate the Path. If path is relative append the path to the project directory by default. 
/// </summary> 
/// <param name="path">Path to validate</param> 
/// <param name="RelativePath">Relative path</param> 
/// <param name="Extension">If want to check for File Path</param> 
/// <returns></returns> 
private static bool ValidateDllPath(ref string path, string RelativePath = "", string Extension = "") 
{ 
    // Check if it contains any Invalid Characters. 
    if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) 
    { 
     try 
     { 
      // If path is relative take %IGXLROOT% as the base directory 
      if (!Path.IsPathRooted(path)) 
      { 
       if (string.IsNullOrEmpty(RelativePath)) 
       { 
        // Exceptions handled by Path.GetFullPath 
        // ArgumentException path is a zero-length string, contains only white space, or contains one or more of the invalid characters defined in GetInvalidPathChars. -or- The system could not retrieve the absolute path. 
        // 
        // SecurityException The caller does not have the required permissions. 
        // 
        // ArgumentNullException path is null. 
        // 
        // NotSupportedException path contains a colon (":") that is not part of a volume identifier (for example, "c:\"). 
        // PathTooLongException The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 characters. 

        // RelativePath is not passed so we would take the project path 
        path = Path.GetFullPath(RelativePath); 

       } 
       else 
       { 
        // Make sure the path is relative to the RelativePath and not our project directory 
        path = Path.Combine(RelativePath, path); 
       } 
      } 

      // Exceptions from FileInfo Constructor: 
      // System.ArgumentNullException: 
      //  fileName is null. 
      // 
      // System.Security.SecurityException: 
      //  The caller does not have the required permission. 
      // 
      // System.ArgumentException: 
      //  The file name is empty, contains only white spaces, or contains invalid characters. 
      // 
      // System.IO.PathTooLongException: 
      //  The specified path, file name, or both exceed the system-defined maximum 
      //  length. For example, on Windows-based platforms, paths must be less than 
      //  248 characters, and file names must be less than 260 characters. 
      // 
      // System.NotSupportedException: 
      //  fileName contains a colon (:) in the middle of the string. 
      FileInfo fileInfo = new FileInfo(path); 

      // Exceptions using FileInfo.Length: 
      // System.IO.IOException: 
      //  System.IO.FileSystemInfo.Refresh() cannot update the state of the file or 
      //  directory. 
      // 
      // System.IO.FileNotFoundException: 
      //  The file does not exist.-or- The Length property is called for a directory. 
      bool throwEx = fileInfo.Length == -1; 

      // Exceptions using FileInfo.IsReadOnly: 
      // System.UnauthorizedAccessException: 
      //  Access to fileName is denied. 
      //  The file described by the current System.IO.FileInfo object is read-only.-or- 
      //  This operation is not supported on the current platform.-or- The caller does 
      //  not have the required permission. 
      throwEx = fileInfo.IsReadOnly; 

      if (!string.IsNullOrEmpty(Extension)) 
      { 
       // Validate the Extension of the file. 
       if (Path.GetExtension(path).Equals(Extension, StringComparison.InvariantCultureIgnoreCase)) 
       { 
        // Trim the Library Path 
        path = path.Trim(); 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
      else 
      { 
       return true; 

      } 
     } 
     catch (ArgumentNullException) 
     { 
      // System.ArgumentNullException: 
      //  fileName is null. 
     } 
     catch (System.Security.SecurityException) 
     { 
      // System.Security.SecurityException: 
      //  The caller does not have the required permission. 
     } 
     catch (ArgumentException) 
     { 
      // System.ArgumentException: 
      //  The file name is empty, contains only white spaces, or contains invalid characters. 
     } 
     catch (UnauthorizedAccessException) 
     { 
      // System.UnauthorizedAccessException: 
      //  Access to fileName is denied. 
     } 
     catch (PathTooLongException) 
     { 
      // System.IO.PathTooLongException: 
      //  The specified path, file name, or both exceed the system-defined maximum 
      //  length. For example, on Windows-based platforms, paths must be less than 
      //  248 characters, and file names must be less than 260 characters. 
     } 
     catch (NotSupportedException) 
     { 
      // System.NotSupportedException: 
      //  fileName contains a colon (:) in the middle of the string. 
     } 
     catch (FileNotFoundException) 
     { 
      // System.FileNotFoundException 
      // The exception that is thrown when an attempt to access a file that does not 
      // exist on disk fails. 
     } 
     catch (IOException) 
     { 
      // System.IO.IOException: 
      //  An I/O error occurred while opening the file. 
     } 
     catch (Exception) 
     { 
      // Unknown Exception. Might be due to wrong case or nulll checks. 
     } 
    } 
    else 
    { 
     // Path contains invalid characters 
    } 
    return false; 
} 
1
Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$"); 
     if (string.IsNullOrWhiteSpace(path) || path.Length < 3) 
     { 
     return false; 
     } 

     if (!driveCheck.IsMatch(path.Substring(0, 3))) 
     { 
     return false; 
     } 
     string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars()); 
     strTheseAreInvalidFileNameChars += @":/?*" + "\""; 
     Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]"); 
     if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3))) 
     { 
     return false; 
     } 

     DirectoryInfo directoryInfo = new DirectoryInfo(Path.GetFullPath(path)); 
     try 
     { 
     if (!directoryInfo.Exists) 
     { 
      directoryInfo.Create(); 
     } 
     } 
     catch (Exception ex) 
     { 
     if (Log.IsErrorEnabled) 
     { 
      Log.Error(ex.Message); 
     } 
     return false; 
     }`enter code here` 

     return true; 
    } 
+0

Điều này làm việc cho tôi .. ngay cả khi Vị trí không tồn tại trong PC –

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