2012-08-02 54 views
5

我想驗證文件名及其完整路徑。我嘗試瞭如下的某些正則表達式,但沒有一個能正常工作。用於驗證基於Windows的文件路徑(包括UNC路徑)的正則表達式

^(?:[\w]\:|\\)(\\[a-z_\-\s0-9\.]+)+\.(txt|gif|pdf|doc|docx|xls|xlsx)$ 
and 
^(([a-zA-Z]\:)|(\\))(\\{1}|((\\{1})[^\\]([^/:*?<>""|]*))+)$ 
etc... 

我的要求是如下所述: 比方說,如果文件名是「c:\ Demo.txt」,那麼它應該檢查每個possibilites一樣,沒有雙斜槓應包括(c:\\Demo\\demo.text)沒有額外的冒號像(c::\Demo\demo.text)。應接受像(\\staging\servers)之類的UNC文件以及其他驗證。請幫忙。我真的被困在這裏。

+0

這是功課嗎? – Steve 2012-08-02 12:09:21

+0

實際上不做功課。一些重要的工作一直困擾着這個。 – Yash 2012-08-02 12:11:08

+1

如果您的文件已上傳,那麼您是真的關心路徑名還是隻關注文件名部分? – Steve 2012-08-02 12:16:58

回答

2

爲什麼不使用File類? 始終使用它!

File f = null; 
string sPathToTest = "C:\Test.txt"; 
try{ 
f = new File(sPathToTest); 
}catch(Exception e){ 
    Console.WriteLine(string.Format("The file \"{0}\" is not a valid path, Error : {1}.", sPathToTest , e.Message); 
} 

MSDN:http://msdn.microsoft.com/en-gb/library/system.io.file%28v=vs.80%29.aspx

也許你只是尋找File.Exists(http://msdn.microsoft.com/en-gb/library/system.io.file.exists%28v=vs.80%29.aspx

也看看到Path類(http://msdn.microsoft.com/en-us/library/system.io.path.aspx

的GetAbsolutePath可能是一種獲得你想要的東西的方法! (http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx

string sPathToTest = "C:\Test.txt"; 
string sAbsolutePath = ""; 
try{ 
    sAbsolutePath = Path.GetAbsolutePath(sPathToTest); 
    if(!string.IsNullOrEmpty(sAbsolutePath)){ 
    Console.WriteLine("Path valid"); 
    }else{ 
    Console.WriteLine("Bad path"); 
    } 
}catch(Exception e){ 
    Console.WriteLine(string.Format("The file \"{0}\" is not a valid path, Error : {1}.", sPathToTest , e.Message); 

} 
+0

我也試過這個。但幫助並不好。所以我想去正則表達式.. – Yash 2012-08-02 12:12:52

+0

該文件將被上傳。該文件的名稱在請求中 – Yash 2012-08-02 12:13:51

+0

使用異常處理來驗證輸入通常不是一個好主意,因爲這會導致顯着的計算開銷。 – 2013-12-30 19:31:43

0

如果你有興趣只在文件名部分(而不是整個路徑,因爲你得到通過上傳文件),那麼你可以嘗試這樣的事:

string uploadedName = @"XX:\dem<<-***\demo.txt"; 

int pos = uploadedName.LastIndexOf("\\"); 
if(pos > -1) 
    uploadedName = uploadedName.Substring(pos+1); 

var c = Path.GetInvalidFileNameChars(); 
if(uploadedName.IndexOfAny(c) != -1) 
    Console.WriteLine("Invalid name"); 
else 
    Console.WriteLine("Acceptable name"); 

這將避免使用Exceptions作爲方法來驅動代碼的邏輯。