2009-12-24 21 views
1

我有一個文本框,允許哪些用戶在這些表單中輸入地址:檢測地址類型給出的字符串

somefile.htm 
someFolder/somefile.htm 
c:\somepath\somemorepath\somefile.htm 
http://someaddress 
\\somecomputer\somepath\somefile.htm 

或導航到一些內容,包含一些標記,任何其他來源。

我應該也把一個下拉附近的文本框列表,問什麼類型的地址是這樣的,或者是有可以自動檢測在文本框中輸入地址的類型的可靠途徑?

回答

3

我不認爲有自動做這個沒有起草自己的檢測特別好的方式。

如果你不介意在故障情況下捕獲異常(我一般),然後下面的代碼片段會爲你的例子(注意,這也將確定目錄爲類型的文件)

工作
public string DetectScheme(string address) 
{ 
    Uri result; 
    if (Uri.TryCreate(address, UriKind.Absolute, out result)) 
    { 
     // You can only get Scheme property on an absolute Uri 
     return result.Scheme; 
    } 

    try 
    { 
     new FileInfo(address); 
     return "file"; 
    } 
    catch 
    { 
     throw new ArgumentException("Unknown scheme supplied", "address"); 
    } 
} 
0

如果只有格式的數量有限,你可以驗證針對這些,只允許有效的。這將使自動檢測更容易一些,因爲您可以使用相同的邏輯。

0
+0

這並不支持UNC或本地存儲路徑。 – Oded 2009-12-24 09:57:16

+1

不幸的是,您不能爲任何不以「http://」或「ftp://」或驅動器號等「scheme」標識符開頭的路徑創建Uri實例;所以在構造Uri實例期間,「\\ somecomputer」,「someFile.htm」都將失敗,並顯示System.UriFormatException – 2009-12-24 09:57:46

1

我會建議使用正則表達式來確定的路徑,類似於

public enum FileType 
    { 
    Url, 
    Unc, 
    Drive, 
    Other, 
    } 
    public static FileType DetermineType(string file) 
    { 
    System.Text.RegularExpressions.MatchCollection matches = System.Text.RegularExpressions.Regex.Matches(file, "^(?<unc>\\\\)|(?<drive>[a-zA-Z]:\\.*)|(?<url>http://).*$", System.Text.RegularExpressions.RegexOptions.IgnoreCase); 
    if (matches.Count > 0) 
    { 
     if (matches[0].Groups["unc"].Value == string.Empty) return FileType.Unc; 
     if (matches[0].Groups["drive"].Value == string.Empty) return FileType.Drive; 
     if (matches[0].Groups["url"].Value == string.Empty) return FileType.Url; 
    } 
    return FileType.Other; 
    }