2013-09-23 145 views
18

我有點困惑。我認爲c#中的「@」是一個標誌,用於像@「C:\ Users ...」那樣逐字地解釋文本。它避免了需要雙反斜槓。爲什麼即使路徑包含@之前的路徑,路徑也能工作「\」

但是,爲什麼路徑也可以工作,如果他們包含雙反斜槓和@? 鐵:

var temp = File.ReadAllText(@"C:\\Users\\text.txt").ToString(); // no error 

我這種情況下,必須將字符串字面意思是「C:\\ \\用戶的text.txt」 - 以前的,因爲「@」 - 這是不是一個有效的Windows路徑(編輯:多數民衆贊成錯了,它是一個有效的路徑,只有探險家不會接受它 - 感謝Muctadir Dinar),那麼爲什麼這個工作?

在此先感謝

+13

多路徑分隔符被解釋爲單路徑分隔符。 –

+4

這是一條有效的路徑。在具有多路徑分隔符的命令提示符(cmd)中嘗試cd命令。 – Muctadir

+0

謝謝Muctadir Dinari,我在資源管理器中試過這個會引發錯誤,我沒有想過cmd。也感謝gp,這是很重要的知道(我搜索Msdn之前,沒有找到任何東西)。 – BudBrot

回答

16

由於內部FileStream期間初始化調用iternal Path.NormalizePath(path, true, maxPathLength)方法來標準化傳遞的路徑值。

可以調用此方法與反射(它有過載,所以得到的MethodInfo是有點棘手):

string path = @"C:\\Users\\text.txt"; 
Type type = typeof(Path); 
var flags = BindingFlags.Static | BindingFlags.NonPublic; 
var binder = Type.DefaultBinder; 
var types = new Type[] { typeof(string), typeof(bool), typeof(int) }; 
var modifiers = new ParameterModifier[0]; 

var normalize = type.GetMethod("NormalizePath", flags, binder, types, modifiers); 
var result = normalize.Invoke(null, new object[] { path, true, 256}); 

輸出:

C:\ Users \用戶的text.txt

+1

感謝您的詳細和解釋良好的答案。 – BudBrot

+1

@Pengu歡迎:)您可以使用反射器等反彙編器調查NormalizePath實現。順便說一句,刪除雙反斜槓非常簡單 - 當通過char檢查路徑char時,它會檢查當前char是否是目錄separator char。如果是這樣,那麼分隔符被追加到結果中,並且標誌(它表明最後添加的字符是目錄分隔符)被更改爲「true」。所有其他目錄分隔符字符將不會被添加到結果,直到找到一些非分隔符字符(這將重置標誌) –

5

所有這些都是有效路徑:

C:\Users\text.txt 
C:\\Users\\text.txt 
C:\\\Users\\\text.txt 
C:\\\\Users\\\\text.txt 

"\\"代表"\"
@"\"代表"\"
@"\\"代表"\\"
"\\\\"代表"\\"

所以你@"C:\\Users\\text.txt"代表"C:\\\\Users\\\\text.txt"有效期

您可以撥打Path.GetFullPath("")得到的絕對路徑。

例如:

Console.WriteLine(@"C:\\Users\\text.txt"); 
Console.WriteLine(Path.GetFullPath(@"C:\\Users\\text.txt")); 

輸出:
C:\\用戶\\的text.txt
C:\ Users \用戶的text.txt

2

string @「C:\ Users \ text.txt」將被解析爲重複的反斜槓字符,但系統將這些重複的字符視爲一個整數來忽略這些重複的字符。 例如,該代碼也將工作:

string s=File.ReadAllText(@"C:\\\Users\\\text.txt"); 

或:

string s=File.ReadAllText(@"C:\\\\\\\\\\\\Users\\\\\\\\\\\text.txt"); 

,但它是不是一個好主意,這樣做。 如果您遍歷這些路徑字符串中的字符,您會看到實際上有幾個反斜槓字符。

foreach (char c in @"C:\\\Users\\\text.txt") ... 

注:應避免指定不止一個反斜槓作爲文件夾分隔符,這種行爲是不可靠的,並且可以在操作系統中或.NET框架的未來版本中改變...