txt文本文件编码格式-图片文件类型检测-音视频文件信息

来源:互联网 发布:2017最热门网络手游 编辑:程序博客网 时间:2024/06/06 07:11

txt文本文件编码格式-图片文件类型检测-音视频文件信息

本文介绍如何获取文本文件的编码格式,如果用c#转换编码格式,如何获取图片文件的类型(不是以文件扩展名来判断),获取音视频文件的基本信息。
文件的字符集在Windows下有两种,一种是ANSI,一种Unicode。
对于Unicode,Windows支持了它的三种编码方式,一种是小尾编码(Unicode),一种是大尾编码(BigEndianUnicode),一种是UTF-8编码。
我们可以从文件的头部来区分一个文件是属于哪种编码。当头部开始的两个字节为 FF FE时,是Unicode的小尾编码;当头部的两个字节为FE FF时,是Unicode的大尾编码;当头部两个字节为EF BB时,是Unicode的UTF-8编码;当它不为这些时,则是ANSI编码。

1 获取文本文件的编码格式,转换编码格式

直接上代码
/// <summary>        /// 获取文本文件的编码格式        /// </summary>        /// <param name="filename">文件路径</param>        /// <returns></returns>        public static System.Text.Encoding GetTxtFileEncodeType(string filename)        {            try            {                System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open,                    System.IO.FileAccess.Read);                System.IO.BinaryReader br = new System.IO.BinaryReader(fs);                Byte[] buffer = br.ReadBytes(2);                br.Close();                fs.Close();                if (buffer[0] >= 0xEF)                {                    if (buffer[0] == 0xEF && buffer[1] == 0xBB)                    {                        return System.Text.Encoding.UTF8;                    }                    else if (buffer[0] == 0xFE && buffer[1] == 0xFF)                    {                        return System.Text.Encoding.BigEndianUnicode;                    }                    else if (buffer[0] == 0xFF && buffer[1] == 0xFE)                    {                        return System.Text.Encoding.Unicode;                    }                    else                    {                        return System.Text.Encoding.Default;                    }                }                else                {                    return System.Text.Encoding.Default;                }            }            catch(Exception ex)            {            }            return null;        }        /// <summary>          /// 转换文本文件编码          /// </summary>          /// <param name="filePath">文本文件路径</param>          /// <param name="oldEncoding">旧的文本编码</param>          /// <param name="newEncoding">要转换成的编码</param>          public static void ChangeTxtFileCodeing(String filePath, Encoding oldEncoding, Encoding newEncoding)        {            try            {                FileStream fs = new FileStream(filePath, FileMode.Open);                StreamReader sr = new StreamReader(fs, oldEncoding);                FileStream fsw = new FileStream(filePath + ".temp", FileMode.OpenOrCreate);                BinaryWriter bw = new BinaryWriter(fsw, newEncoding);                Char[] buffer = new char[1024];                int i = sr.Read(buffer, 0, 1024);                while (i > 0)                {                    //转换                      Byte[] buf = newEncoding.GetBytes(buffer, 0, i);                    bw.Write(buf);                    i = sr.Read(buffer, 0, 1024);                }                sr.Close();                bw.Close();                fs.Close();                fsw.Close();                File.Delete(filePath);                File.Move(filePath + ".temp", filePath);            }            catch (Exception ex)            {            }        }  

一个调用的例子:
#region === txt 非utf8文件转换成 utf-8编码格式 ===                    if (fileExt.ToLower().Contains("txt"))                    {                        var filecodeType = Utility.FileHelper.GetTxtFileEncodeType(savePath);                        if (filecodeType != System.Text.Encoding.UTF8)                        {                            Utility.FileHelper.ChangeTxtFileCodeing(savePath, Encoding.Default, Encoding.UTF8);                        }                    }                    #endregion


2 获取图片类型-格式

        /// <summary>        /// 获取Image图片格式        /// </summary>        /// <param name="filePath">文件路径</param>        /// <param name="format">out 图片格式后缀 如: .jpg,.gif,.bmp,.png</param>        /// <returns></returns>        public static System.Drawing.Imaging.ImageFormat GetImageFormat(String filePath, out string format)        {            byte[] sb = new byte[2];  //这次读取的就是直接0-1的位置长度了.            FileStream file = new FileStream(filePath, FileMode.Open);            file.Read(sb, 0, sb.Length);            //根据文件头判断            string strFlag = sb[0].ToString() + sb[1].ToString();            file.Close();            //察看格式类型            switch (strFlag)            {                //JPG格式                case "255216":                    format = ".jpg";                    return System.Drawing.Imaging.ImageFormat.Jpeg;                //GIF格式                case "7173":                    format = ".gif";                    return System.Drawing.Imaging.ImageFormat.Gif;                //BMP格式                case "6677":                    format = ".bmp";                    return System.Drawing.Imaging.ImageFormat.Bmp;                //PNG格式                case "13780":                    format = ".png";                    return System.Drawing.Imaging.ImageFormat.Png;                //其他格式                default:                    format = string.Empty;                    return null;            }        }

3 音视频文件信息

音视频文件的相关信息相对复杂,参考该类文件结构也可以利用读取相应的字节来判断,但这里我们用一个第三方的类库来做,本例用的是 mediaInfo.net 如下图,直接在nuget里可搜索到并安装



用法如下:
MediaInfoDotNet.MediaFile aviFile = new MediaInfoDotNet.MediaFile(@"M:\lifobao\song\amituofo1.mp3");            Console.WriteLine();            Console.WriteLine("General ---------------------------------");            Console.WriteLine();            Console.WriteLine("File Name : {0}", aviFile.filePath);            Console.WriteLine("Format : {0}", aviFile.General.Format);            Console.WriteLine("Duration : {0}", aviFile.General.Duration);            Console.WriteLine("Bitrate : {0}", aviFile.General.BitRate);            if (aviFile.Audio.Count > 0)            {                Console.WriteLine();                Console.WriteLine("Audio ---------------------------------");                Console.WriteLine();                Console.WriteLine("Format : {0}", aviFile.Audio[0].Format);                Console.WriteLine("Bitrate : {0}", aviFile.Audio[0].BitRate.ToString());                Console.WriteLine("Channels : {0}", aviFile.Audio[0].Channels.ToString());                Console.WriteLine("Sampling : {0}", aviFile.Audio[0].SampleRate.ToString());            }            if (aviFile.Video.Count > 0)            {                Console.WriteLine();                Console.WriteLine("Video ---------------------------------");                Console.WriteLine();                Console.WriteLine("Format : {0}", aviFile.Video[0].Format);                Console.WriteLine("Bit rate : {0}", aviFile.Video[0].BitRate.ToString());                Console.WriteLine("Frame rate : {0}", aviFile.Video[0].FrameRate.ToString());                Console.WriteLine("Frame size : {0}", aviFile.Video[0].frameCount.ToString());            }

图片格式等信息也可以用该类来处理

--- end ---

0 0
原创粉丝点击