这个程序可以把整个目录的文本文件改成UNIX格式,源码是用C#写的。
目录
一、从Microsoft Store安装
二、从github获取源码
三、功能介绍
3.1 运行
3.2 浏览
3.3 转换
3.4 转换(无列表)
3.5 取消
3.6 帮助
四、源码解读
五、讨论和建议
一、从Microsoft Store安装
Microsoft Store下载链接:ctDos2Unix - Windows官方下载 | 微软应用商店 | Microsoft Store
打开此网页,从这里进入商店,可以免费安装试用版(网页里可能不会显示“免费试用”),试用版没有期限并且和正式版没有区别(不理解是吧,这是我用来做应用上架练习的。)
二、从github获取源码
codetoys/Dos2Unix: txt tools ,Encoding conversionhttps://github.com/codetoys/Dos2Unix
当然,此源码不包含用来打包MSIX的项目,仅包含程序本身的源码。
简单程序,只有一个exe文件,依赖.net framework 4.8,应该不用额外安装。
程序仅保存一个属性,具体保存在哪里你要看Properties.Settings.Default.Save()怎么回事了(一般在AppData的Local下面)。
用visual studio 2022打开sln文件即可。
三、功能介绍
3.1 运行
安装后会有个开始菜单项(Microsoft Store的标准行为),直接编译源代码就是直接运行就行了。
3.2 浏览
选择一个目录,显示哪些需要转换(是文本文件),对此功能有意见?给我提呀!
3.3 转换
会先生成一个备份目录然后将原来的目录里的文本文件转换为UNIX格式。
备份目录和原目录在同一位置,如果有问题删掉原来的,把备份目录的名字改回去就可以了。
3.4 转换(无列表)
如果文件太多转换比较慢,可以不在列表显示,这样会快很多(其实我已经优化过了,不会快很多的)。
3.5 取消
浏览和转换都是由后台线程处理的,处理过程中浏览和转换按钮都是禁用的,处理结束才会恢复,在处理过程中可以点击“取消”按钮提前结束。
3.6 帮助
只是个消息框:
汗!这个程序最早是2007年写的,18年了,我说过C#是我的业余爱好。
四、源码解读
好吧,核心就一个函数,对目录进行递归处理。
public void FindAllFile(string path, bool checkonly, bool nolist)
{
DirectoryInfo[] ChildDirectory;//子目录集
FileInfo[] NewFileInfo;//当前所有文件
DirectoryInfo FatherDirectory = new DirectoryInfo(path); //当前目录
ChildDirectory = FatherDirectory.GetDirectories("*.*"); //得到子目录集
NewFileInfo = FatherDirectory.GetFiles();//得到文件集,可以进行操作
//MessageBox.Show(path, "当前目录");
foreach (FileInfo fileInfo in NewFileInfo)
{
if (bCancel) break;
bool istext = ProcessFile(fileInfo.FullName, checkonly);
++file_count;
if (istext) ++file_text_count;
if (!nolist)
{
ListViewItem item = new ListViewItem(fileInfo.DirectoryName);
item.SubItems.Add(fileInfo.Name);
item.SubItems.Add(fileInfo.Extension);
if (istext)
{
if (checkonly)
{
item.SubItems.Add(isLanguageZH ? "需转换" : "Conversion is required");
}
else
{
item.SubItems.Add("OK");
}
}
else
{
item.SubItems.Add("");
}
UpdateUI(item);
}
}
foreach (DirectoryInfo dirInfo in ChildDirectory)
{
if (bCancel) break;
FindAllFile(dirInfo.FullName, checkonly, nolist);
}
}
处理文件也很简单:
public bool ProcessFile(string file, bool checkonly)
{
bool isASCII = true;
FileStream filestream = new FileStream(file, FileMode.Open, FileAccess.Read);
byte[] data = new byte[filestream.Length];
filestream.Read(data, 0, (int)filestream.Length);
filestream.Close();
//MessageBox.Show(data.Length.ToString(),file);
int i;
for (i = 0; i < data.Length; ++i)
{
if (data[i] == 0)
{
//MessageBox.Show("非文本文件", file);
isASCII = false;
break;
}
}
if (checkonly)
{
return isASCII;
}
else
{
File.SetAttributes(file, File.GetAttributes(file) & ~FileAttributes.ReadOnly);
if (!isASCII) return isASCII;
}
FileStream outfile = new FileStream(file, FileMode.Truncate, FileAccess.Write);
for (i = 0; i < data.Length; ++i)
{
if (i < data.Length - 1 && data[i] == '\r' && data[i + 1] == '\n') continue;
outfile.WriteByte(data[i]);
}
//MessageBox.Show(outfile.Length.ToString(), file);
outfile.Close();
return isASCII;
}
五、讨论和建议
有问题跟我说啊,我会升级的。
可以在这里提,也可以在github提,也可以在Microsoft Store里面提。
(这里是文档结束。)