FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
EncodingNormalior/EncodingNormalior/Program.cs at master · dotnet-campus/EncodingNormalior · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
dotnet-campus
/
EncodingNormalior
Public
Notifications
You must be signed in to change notification settings
Fork
17
Star
68
Code
Issues
4
Pull requests
3
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
EncodingNormalior
/
EncodingNormalior
/
Program.cs
Copy path
More file actions
More file actions
Latest commit
History
History
History
405 lines (347 loc) · 15.5 KB
Breadcrumbs
EncodingNormalior
/
EncodingNormalior
/
Program.cs
Copy path
File metadata and controls
405 lines (347 loc) · 15.5 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
using
System
;
using
System
.
Collections
.
Generic
;
using
System
.
IO
;
using
System
.
Linq
;
using
System
.
Net
.
Mime
;
using
System
.
Reflection
;
using
System
.
Runtime
.
CompilerServices
;
using
System
.
Text
;
using
System
.
Threading
.
Tasks
;
using
EncodingNormalior
.
Model
;
namespace
EncodingNormalior
{
public
class
Program
{
private
const
string
IncludeFileCommand
=
"--IncludeFile"
;
private
const
string
WhiteListCommand
=
"--WhiteList"
;
private
const
string
EncodingCommand
=
"-E"
;
private
const
string
FolderCommand
=
"-f"
;
private
const
string
ProjectCommand
=
"-p"
;
private
const
string
TryFixCommand
=
"--TryFix"
;
private
const
string
Quiet
=
"--Quiet"
;
// private const string Usage =
//@"usage: EncodingNormalior <command> [args]
// [--IncludeFile path] [--WhiteList path] [-E Encoding]
//These are EncodingNormalior commands
// -f folder
// the folder need to check all the file
// whether the file comply with Encoding
// -p csproj
// Check all the file whether the file
// comply with Encoding in the project
//编码规范工具使用方法:
// 必选命令:输入要检测的文件夹或*csproj文件
// 输入格式:
// 输入文件夹 -f 文件夹路径
// 输入csproj文件 -p csproj文件路径
// 不能同时输入文件夹和csproj文件
// 可选命令:
// 输入格式:
// 必须包含的文件 --IncludeFile 文件路径
// 文件白名单 --WhiteList 文件路径
// 规定的编码 -E Encoding";
private
const
string
Usage
=
@"usage: EncodingNormalior <command> [args]
[--IncludeFile path] [--WhiteList path] [-E Encoding] [--TryFix true] [--Quiet true]
These are EncodingNormalior commands
-f folder
the folder need to check all the file
whether the file comply with Encoding
编码规范工具使用方法:
必选命令:输入要检测的文件夹或*csproj文件
输入格式:
输入文件夹 -f 文件夹路径
可选命令:
输入格式:
必须包含的文件 --IncludeFile 文件路径
文件白名单 --WhiteList 文件路径
规定的编码 -E Encoding 默认是 Utf8 编码
是否尝试修复编码 --TryFix 设置true将尝试自动修复,默认为不自动修复
是否进行静默判断 --Quiet 设置true将只输出结果,不输出中间信息
Encoding 包含 utf8、 gbk、 ascii、utf16、BigEndianUnicode
程序从输入的文件夹读取配置,越靠近文本的配置优先度越高。
如果不存在配置,使用默认配置。
白名单配置名称: WhiteList.txt
必须包含的文件配置名称: IncludeFile.txt
要求配置编码是 UTF8"
;
//目录高于全局
//继承
//输出不符合
//有不符合Main返回不是0
public
const
string
NoFolderArgException
=
"不存在文件夹参数"
;
private
static
void
ParseCommand
(
CommandLineArgumentParser
arguments
)
{
ConformCommand
(
arguments
)
;
string
folder
=
arguments
.
Get
(
FolderCommand
)
.
Next
;
if
(
string
.
IsNullOrEmpty
(
folder
)
)
{
throw
new
ArgumentCommadnException
(
NoFolderArgException
)
;
}
// 如果输入 "E:\lindexi\EncodingNormalior\" 那么命令行将会传入 E:\lindexi\EncodingNormalior\" 字符串
if
(
folder
.
EndsWith
(
"
\"
"
)
)
{
folder
=
folder
.
Substring
(
0
,
folder
.
Length
-
1
)
;
}
folder
=
Path
.
GetFullPath
(
folder
)
;
if
(
!
Directory
.
Exists
(
folder
)
)
{
throw
new
ArgumentCommadnException
(
"不存在文件夹"
+
folder
)
;
}
EncodingScrutatorFolder
encodingScrutatorFolder
=
new
EncodingScrutatorFolder
(
new
DirectoryInfo
(
folder
)
)
;
if
(
arguments
.
Has
(
IncludeFileCommand
)
)
{
var
includeFile
=
arguments
.
Get
(
IncludeFileCommand
)
.
Take
(
)
;
var
wildCardFile
=
/*IncludeFileSetting.ReadIncludeFile(includeFile);*/
new
FileInfo
(
includeFile
)
;
IncludeFileSetting
includeFileSetting
=
new
IncludeFileSetting
(
wildCardFile
)
;
encodingScrutatorFolder
.
IncludeFileSetting
=
includeFileSetting
;
}
if
(
arguments
.
Has
(
EncodingCommand
)
)
{
string
encodingCommand
=
arguments
.
Get
(
EncodingCommand
)
.
Take
(
)
;
encodingCommand
=
encodingCommand
.
ToLower
(
)
;
Encoding
encoding
;
switch
(
encodingCommand
)
{
case
"utf8"
:
case
"utf-8"
:
encoding
=
Encoding
.
UTF8
;
break
;
case
"gbk"
:
encoding
=
Encoding
.
GetEncoding
(
"gbk"
)
;
break
;
case
"bigendianunicode"
:
encoding
=
Encoding
.
BigEndianUnicode
;
break
;
default
:
throw
new
ArgumentException
(
"输入无法识别编码"
)
;
}
encodingScrutatorFolder
.
SitpulationEncodingSetting
=
new
SitpulationEncodingSetting
(
)
{
SitpulationEncoding
=
encoding
}
;
}
if
(
arguments
.
Has
(
WhiteListCommand
)
)
{
var
whiteListFile
=
arguments
.
Get
(
WhiteListCommand
)
.
Take
(
)
;
encodingScrutatorFolder
.
InspectFileWhiteListSetting
=
InspectFileWhiteListSetting
.
ReadWhiteListSetting
(
whiteListFile
)
;
}
encodingScrutatorFolder
.
InspectFolderEncoding
(
)
;
var
output
=
PintnoConformEncodingFile
(
encodingScrutatorFolder
)
;
if
(
arguments
.
Has
(
Quiet
)
&&
bool
.
TryParse
(
arguments
.
Get
(
Quiet
)
.
Take
(
)
,
out
var
shouldQuiet
)
&&
shouldQuiet
is
true
)
{
// 如果需要静默,那么什么都不输出
}
else
{
Console
.
WriteLine
(
output
)
;
}
if
(
IllicitFile
.
Count
>
0
)
{
if
(
arguments
.
Has
(
TryFixCommand
)
)
{
var
tryFix
=
arguments
.
Get
(
TryFixCommand
)
.
Take
(
)
;
if
(
bool
.
TryParse
(
tryFix
.
ToString
(
)
,
out
var
value
)
&&
value
is
true
)
{
TryFix
(
encodingScrutatorFolder
)
;
return
;
}
}
StringBuilder
str
=
new
StringBuilder
(
)
;
str
.
Append
(
$
"存在不符合规范文件:
{
IllicitFile
.
Count
}
\r
\n
"
)
;
foreach
(
var
temp
in
IllicitFile
)
{
str
.
Append
(
temp
.
File
.
FullName
+
"
\r
\n
"
)
;
}
str
.
Append
(
"可采用如下命令修复文件编码:"
)
.
Append
(
"
\r
\n
"
)
// 强行规定换行
// 下面使用 dotnet tool update 的 update 是预期的,这个命令的意思是在没有安装的时候安装,有安装的时候更新
.
Append
(
"dotnet tool update -g dotnetCampus.EncodingNormalior"
)
.
Append
(
"
\r
\n
"
)
.
Append
(
$
"EncodingNormalior -f
\"
{
encodingScrutatorFolder
.
FaceFolder
.
FullName
}
\"
--TryFix true"
)
.
Append
(
"
\r
\n
"
)
.
Append
(
"或安装编码规范 VS 插件工具:https://marketplace.visualstudio.com/items?itemName=lindexigd.vs-extension-18109"
)
.
Append
(
"
\r
\n
"
)
;
throw
new
EncodingNormaliorException
(
str
.
ToString
(
)
)
;
}
else
{
Console
.
WriteLine
(
"恭喜你,没有存在不规范文件
\r
\n
"
)
;
}
}
private
static
void
TryFix
(
EncodingScrutatorFolder
encodingScrutatorFolder
)
{
Console
.
WriteLine
(
$
"存在不符合规范文件:
{
IllicitFile
.
Count
}
\r
\n
"
)
;
var
sitpulationEncoding
=
encodingScrutatorFolder
.
SitpulationEncodingSetting
.
SitpulationEncoding
;
var
SitpulationEncodingName
=
sitpulationEncoding
.
EncodingName
;
Console
.
WriteLine
(
$
"开始尝试自动修复格式,输出格式为
{
SitpulationEncodingName
}
"
)
;
foreach
(
var
encodingScrutatorFile
in
IllicitFile
)
{
Console
.
WriteLine
(
$
"开始修复
{
encodingScrutatorFile
.
Name
}
从
{
encodingScrutatorFile
.
Encoding
.
EncodingName
}
到
{
SitpulationEncodingName
}
可信度
{
encodingScrutatorFile
.
ConfidenceCount
:
0.00
}
"
)
;
using
(
var
fileStream
=
new
FileStream
(
encodingScrutatorFile
.
File
.
FullName
,
FileMode
.
Open
,
FileAccess
.
ReadWrite
,
FileShare
.
None
)
)
{
var
streamReader
=
new
StreamReader
(
fileStream
,
encodingScrutatorFile
.
Encoding
)
;
var
text
=
streamReader
.
ReadToEnd
(
)
;
// 截断长度,相当于重新创建文件。如果没有下面代码,那么在前后文件长度修改时,将会在文件最后加上原先的文件
fileStream
.
Position
=
0
;
fileStream
.
SetLength
(
0
)
;
var
streamWriter
=
new
StreamWriter
(
fileStream
,
sitpulationEncoding
)
;
streamWriter
.
Write
(
text
)
;
streamWriter
.
Flush
(
)
;
}
}
Console
.
WriteLine
(
$
"修复完成"
)
;
}
private
static
void
ConformCommand
(
CommandLineArgumentParser
arguments
)
{
List
<
string
>
command
=
new
List
<
string
>
(
)
{
IncludeFileCommand
,
WhiteListCommand
,
EncodingCommand
,
FolderCommand
,
TryFixCommand
,
Quiet
,
}
;
foreach
(
var
arg
in
arguments
.
GetEnumerator
(
)
.
Where
(
temp
=>
(
(
string
)
temp
)
.
StartsWith
(
"-"
)
)
)
{
if
(
command
.
All
(
temp
=>
!
temp
.
Equals
(
arg
)
)
)
{
throw
new
ArgumentCommadnException
(
"存在无法识别参数"
+
arg
)
;
}
}
if
(
!
arguments
.
Has
(
FolderCommand
)
)
{
throw
new
ArgumentCommadnException
(
"需要包含要检测文件夹"
)
;
}
}
public
static
void
Main
(
string
[
]
args
)
{
try
{
#if
NETCOREAPP
// [dotnet core 使用 GBK 编码](https://blog.lindexi.com/post/dotnet-core-%E4%BD%BF%E7%94%A8-GBK-%E7%BC%96%E7%A0%81.html )
Encoding
.
RegisterProvider
(
CodePagesEncodingProvider
.
Instance
)
;
#endif
var
arguments
=
CommandLineArgumentParser
.
Parse
(
args
)
;
try
{
ParseCommand
(
arguments
)
;
}
catch
(
ArgumentCommadnException
e
)
{
Console
.
WriteLine
(
e
.
Message
+
"
\r
\n
"
+
Usage
)
;
Environment
.
Exit
(
-
1
)
;
}
}
catch
(
Exception
e
)
{
Console
.
Error
.
WriteLine
(
e
.
Message
)
;
Environment
.
Exit
(
-
1
)
;
}
Environment
.
Exit
(
0
)
;
}
/// <summary>
/// 输出不符合规范编码文件
/// </summary>
private
static
string
PintnoConformEncodingFile
(
EncodingScrutatorFolder
encodingScrutatorFolder
,
string
white
=
""
,
StringBuilder
str
=
null
)
{
if
(
str
==
null
)
{
str
=
new
StringBuilder
(
)
;
}
foreach
(
var
temp
in
encodingScrutatorFolder
.
Folder
)
{
PintnoConformEncodingFile
(
temp
,
white
+
temp
.
Name
+
"/"
,
str
)
;
}
foreach
(
var
temp
in
encodingScrutatorFolder
.
File
)
{
//str.Append(white);
str
.
Append
(
$
"文件名:
{
white
}
{
temp
.
File
.
Name
}
\r
\n
"
)
;
if
(
temp
.
Ignore
)
{
str
.
Append
(
"文件忽略
\r
\n
"
)
;
}
else
{
str
.
Append
(
$
"编码 :
{
temp
.
Encoding
.
EncodingName
.
PadRight
(
10
)
}
{
(
temp
.
Encoding
.
Equals
(
Encoding
.
ASCII
)
?
""
:
$
"置信度:
{
temp
.
ConfidenceCount
}
"
)
}
\r
\n
"
)
;
//str.Append("编码 :" + temp.Encoding.EncodingName + " 置信度 " + temp.ConfidenceCount + " ");
str
.
Append
(
"状态:"
)
;
if
(
encodingScrutatorFolder
.
SitpulationEncodingSetting
.
ConformtotheDefaultEncoding
(
temp
.
Encoding
)
)
{
str
.
Append
(
"文件符合规范"
)
;
}
else
{
str
.
Append
(
"文件不符合规范"
)
;
IllicitFile
.
Add
(
temp
)
;
}
str
.
Append
(
"
\r
\n
"
)
;
//str.Append(
// encodingScrutatorFolder.SitpulationEncodingSetting.ConformtotheDefaultEncoding(temp.Encoding)
// ? "文件符合规范"
// : "文件不符合规范");
}
str
.
Append
(
"
\r
\n
"
)
;
}
return
str
.
ToString
(
)
;
}
/// <summary>
/// 不符合规范的文件列表
/// </summary>
private
static
readonly
List
<
EncodingScrutatorFile
>
IllicitFile
=
new
List
<
EncodingScrutatorFile
>
(
)
;
//private static string Print(EncodingScrutatorFolder encodingScrutatorFolder, string white = "", StringBuilder str = null)
//{
// //Console.WriteLine("包含文件");
// //foreach (var temp in encodingScrutatorFolder.IncludeFileSetting.IncludeWildcardFile)
// //{
// // Console.WriteLine(temp);
// //}
// //Console.WriteLine("不包含文件");
// //foreach (var temp in encodingScrutatorFolder.InspectFileWhiteListSetting.FileWhiteList)
// //{
// // Console.WriteLine(temp);
// //}
// //foreach (var temp in encodingScrutatorFolder.InspectFileWhiteListSetting.FolderWhiteList)
// //{
// // Console.WriteLine(temp);
// //}
// if (str == null)
// {
// str = new StringBuilder();
// }
// foreach (var temp in encodingScrutatorFolder.Folder)
// {
// Print(temp, white + temp.Name + "/", str);
// }
// //StringBuilder str=new StringBuilder();
// foreach (var temp in encodingScrutatorFolder.File)
// {
// str.Append(white);
// str.Append(temp.File.Name + " ");
// if (temp.Ignore)
// {
// str.Append("文件忽略");
// }
// else
// {
// str.Append("编码 " + temp.Encoding.EncodingName + " 置信度 " + temp.ConfidenceCount);
// }
// str.Append("\r\n");
// }
// //using (StreamWriter stream=new StreamWriter(
// // new FileStream("E:\\1.txt",FileMode.Create)))
// //{
// // stream.Write(str.ToString());
// //}
// //Console.WriteLine(str.ToString());
// return str.ToString();
//}
}
}
Back
|
FazBrowse Home
|
New Git URL