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

xiaoxiao2021-02-27  404

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 ---
转载请注明原文地址: https://www.6miu.com/read-3761.html

最新回复(0)