最近有个需求,xml文件修改时dos格式要变成unix格式,查找了一下三个文件的区别在于换行符
unix格式:-LF(
)
dos格式:-LF/CR(
)
mac格式:-CR(
)
C#后台代码
public class ConvertFileHelper { public enum FileType { DOS, UNIX, MAC } private const byte CR = 0x0D;// private const byte LF = 0x0A;// 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); } } }