vs报错“以下文件中的行尾不一致,是否将行尾标准化”

vs报错“以下文件中的行尾不一致,是否将行尾标准化”

clipboard

分析:

通过读取源文件,发现换行都使用的是“\n”

clipboard[1]

 

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            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

image

posted @ 2016-05-17 12:01  远方V3  阅读(26392)  评论(2编辑  收藏  举报