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

203 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值