標籤:
vs報錯“以下檔案中的行尾不一致,是否將行尾標準化”
分析:
通過讀取源檔案,發現換行都使用的是“\n”
Windows和Unix不同的標準引起的...即“斷行符號”和“換行”的問題...
符號 |
ASCII碼 |
意義 |
\n |
10 |
換行NL |
\r |
13 |
斷行符號CR |
在電腦還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字元。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。一個叫做“斷行符號”,告訴打字機把列印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。到了GUI時代游標都是自由移動的不再有斷行符號的意義...
所以符合Windows開發標準的文字編輯器Visual Studio才會提醒你當前編輯的文本不符合Windows行尾標準..
1.Windows 中的分行符號"\r\n"
2.Unix/Linux 平台分行符號是 "\n"。
3.MessageBox.Show() 的分行符號為 "\n"
4.Console 的分行符號為 "\n"
分行符號還因平台差異而不同。
解決方案:
1. 為保持平台的通用性,可以用系統預設分行符號 System.Environment.NewLine。
2. 替換所有的非標準分行符號
1 class Program_Utf8 2 { 3 static void Main(string[] args) 4 { 5 String folderPath = @"E:\檔案夾路徑\"; 6 7 ParseDirectory(folderPath, "*.cs", (filePath) => 8 { 9 string text = "";10 using (StreamReader read = new StreamReader(filePath, Encoding.Default))11 {12 string oldtext = read.ReadToEnd();13 text = oldtext;14 text = text.Replace("\n", "\r\n");15 text = text.Replace("\r\r\n", "\r\n"); // 防止替換了正常的分行符號 16 if (oldtext.Length == text.Length)17 {18 Console.WriteLine(filePath.Substring(filePath.LastIndexOf("\\") + 1) + " 不需要標準化");19 return; // 如果沒有變化就退出 20 }21 }22 File.WriteAllText(filePath, text, Encoding.UTF8); //utf-8格式儲存,防止亂碼23 24 Console.WriteLine(filePath.Substring(filePath.LastIndexOf("\\") + 1) + " 行尾標準化完成");25 });26 27 Console.ReadKey();28 }29 30 /// <summary>遞迴所有的目錄,根據過濾器找到檔案,並使用委託來統一處理</summary>31 /// <param name="info"></param>32 /// <param name="filter"></param>33 /// <param name="action"></param>34 static void ParseDirectory(string folderPath, string filter, Action<string> action)35 {36 if (string.IsNullOrWhiteSpace(folderPath)37 || folderPath.EndsWith("debug", StringComparison.OrdinalIgnoreCase)38 || folderPath.EndsWith("obj", StringComparison.OrdinalIgnoreCase)39 || folderPath.EndsWith("bin", StringComparison.OrdinalIgnoreCase))40 return;41 42 Console.WriteLine("讀取目錄:" + folderPath);43 44 // 處理檔案45 string[] fileNameArray = Directory.GetFiles(folderPath, filter);46 if (fileNameArray.Length > 0)47 {48 foreach (var filePath in fileNameArray)49 {50 action(filePath);51 }52 }53 else54 {55 Console.WriteLine("未發現檔案!");56 }57 58 Console.WriteLine("====================================");59 60 //得到子目錄,遞迴處理61 string[] dirs = Directory.GetDirectories(folderPath);62 var iter = dirs.GetEnumerator();63 while (iter.MoveNext())64 {65 string str = (string)(iter.Current);66 ParseDirectory(str, filter, action);67 }68 }69 }
View Code
vs報錯“以下檔案中的行尾不一致,是否將行尾標準化”