简介
| 系统 | 换行符 | 备注 |
|---|
| windows | CR/LF | \r\n |
| unix | LF | \n |
| mac | CR | \r |
代码实现
using System;
using System.IO;
namespace SmartREIN.Common
{
public class TextDocumentFileTypeConvert
{
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);
}
}
}
}
#### 参考
[C# Dos、Unix、Mac文件格式之间的相互转换 - Uniqueness - 博客园 (cnblogs.com)]https: