最近有个需求,xml文件修改时dos格式要变成unix格式,查找了一下三个文件的区别在于换行符
unix格式:-LF(\n)
dos格式:-LF/CR(\r\n)
mac格式:-CR(\r)
C#后台代码
public class ConvertFileHelper
{
public enum FileType
{
DOS,
UNIX,
MAC
}
private const byte CR = 0x0D;//\r
private const byte LF = 0x0A;//\n
private static readonly byte[] DOS_LINE_ENDING = new byte[] { CR, LF };
public static FileType DetermineFileFormat(string fileName)
{
byte[] data = File.ReadAllBytes(fileName);
int position = 0;
if (Array.IndexOf(data, LF, position) >= 0)
{
if (Array.IndexOf(data, CR, position) >= 0)
{
return FileType.DOS;
}
return FileType.UNIX;
}
if (Array.IndexOf(data, CR, position) >= 0)
{
return FileType.MAC;
}
return FileType.DOS;
}
public static void AutoFileTypeConvert(string fileName, FileType fileType)
{
FileType oldFileType = DetermineFileFormat(fileName);
if (fileType == FileType.DOS)
{
if (oldFileType == FileType.DOS)
return;
else if (oldFileType == FileType.UNIX)
Unix2Dos(fileName);
else if (oldFileType == FileType.MAC)
Mac2Dos(fileName);
}
else if (fileType == FileType.UNIX)
{
if (oldFileType == FileType.UNIX)
return;
else if (oldFileType == FileType.DOS)
Dos2Unix(fileName);
else if (oldFileType == FileType.MAC)
Mac2Unix(fileName);
}
else if (fileType == FileType.MAC)
{
if (oldFileType == FileType.MAC)
return;
else if (oldFileType == FileType.DOS)
Dos2Mac(fileName);
else if (oldFileType == FileType.UNIX)
Unix2Mac(fileName);
}
}
public static void Unix2Dos(string fileName)
{
byte[] data = File.ReadAllBytes(fileName);
using (FileStream fileStream = File.OpenWrite(fileName))
{
BinaryWriter bw = new BinaryWriter(fileStream);
int position = 0;
int index = 0;
do
{
index = Array.IndexOf(data, LF, position);
if (index >= 0)
{
if (index > 0 && data[index - 1] == CR)
{
bw.Write(data, position, index - position + 1);
}
else
{
bw.Write(data, position, index - position);
bw.Write(DOS_LINE_ENDING);
}
position = index + 1;
}
}
while (index >= 0);
bw.Write(data, position, data.Length - position);
fileStream.SetLength(fileStream.Position);
}
}
public static void Mac2Dos(string fileName)
{
byte[] data = File.ReadAllBytes(fileName);
int len = data.Length - 1;
using (FileStream fileStream = File.OpenWrite(fileName))
{
BinaryWriter bw = new BinaryWriter(fileStream);
int position = 0;
int index = 0;
do
{
index = Array.IndexOf(data, CR, position);
if (index >= 0)
{
if (index >= 0 && index < len && data[index + 1] == LF)
{
bw.Write(data, position, index - position + 1);
}
else
{
bw.Write(data, position, index - position);
bw.Write(DOS_LINE_ENDING);
}
position = index + 1;
}
} while (index >= 0);
bw.Write(data, position, data.Length - position);
fileStream.SetLength(fileStream.Position);
}
}
public static void Dos2Unix(string fileName)
{
byte[] data = File.ReadAllBytes(fileName);
using (FileStream fileStream = File.OpenWrite(fileName))
{
BinaryWriter bw = new BinaryWriter(fileStream);
int position = 0;
int index = 0;
do
{
index = Array.IndexOf(data, CR, position);
if (index >= 0)
{
if (index > 0 && data[index + 1] == LF)
{
bw.Write(data, position, index - position);
}
else
{
bw.Write(data, position, index - position + 1);
}
position = index + 1;
}
}
while (index >= 0);
bw.Write(data, position, data.Length - position);
fileStream.SetLength(fileStream.Position);
}
}
public static void Dos2Mac(string fileName)
{
byte[] data = File.ReadAllBytes(fileName);
using (FileStream fileStream = File.OpenWrite(fileName))
{
BinaryWriter bw = new BinaryWriter(fileStream);
int position = 0;
int index = 0;
do
{
index = Array.IndexOf(data, LF, position);
if (index >= 0)
{
if (index > 0 && data[index - 1] == CR)
{
bw.Write(data, position, index - position);
}
else
{
bw.Write(data, position, index - position + 1);
}
position = index + 1;
}
}
while (index >= 0);
bw.Write(data, position, data.Length - position);
fileStream.SetLength(fileStream.Position);
}
}
public static void Mac2Unix(string fileName)
{
byte[] data = File.ReadAllBytes(fileName);
int len = data.Length - 1;
using (FileStream fileStream = File.OpenWrite(fileName))
{
BinaryWriter bw = new BinaryWriter(fileStream);
int position = 0;
int index = 0;
do
{
index = Array.IndexOf(data, CR, position);
if (index >= 0)
{
if (index >= 0 && index < len && data[index + 1] == LF)
{
bw.Write(data, position, index - position + 1);
}
else
{
bw.Write(data, position, index - position);
bw.Write(LF);
}
position = index + 1;
}
} while (index >= 0);
bw.Write(data, position, data.Length - position);
fileStream.SetLength(fileStream.Position);
}
}
public static void Unix2Mac(string fileName)
{
byte[] data = File.ReadAllBytes(fileName);
using (FileStream fileStream = File.OpenWrite(fileName))
{
BinaryWriter bw = new BinaryWriter(fileStream);
int position = 0;
int index = 0;
do
{
index = Array.IndexOf(data, LF, position);
if (index >= 0)
{
if (index > 0 && data[index - 1] == CR)
{
bw.Write(data, position, index - position + 1);
}
else
{
bw.Write(data, position, index - position);
bw.Write(CR);
}
position = index + 1;
}
}
while (index >= 0);
bw.Write(data, position, data.Length - position);
fileStream.SetLength(fileStream.Position);
}
}
}