标签:
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 classProgram_Utf82 {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 = newStreamReader(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 /// 递归所有的目录,根据过滤器找到文件,并使用委托来统一处理
31 ///
32 ///
33 ///
34 static void ParseDirectory(string folderPath, string filter, Actionaction)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 infileNameArray)49 {50 action(filePath);51 }52 }53 else
54 {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
标签: