C# windows unix mac 文件格式之间转换

392 阅读2分钟

简介

系统换行符备注
windowsCR/LF\r\n
unixLF\n
macCR\r

代码实现

using System;
using System.IO;

namespace SmartREIN.Common
{
    public class TextDocumentFileTypeConvert
    {
        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);
            }
        }
    }
}


#### 参考
[C# Dos、Unix、Mac文件格式之间的相互转换 - Uniqueness - 博客园 (cnblogs.com)]https://www.cnblogs.com/DerekDeng/p/11556232.html)