您的位置:首页 > 其它

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

2017-05-04 14:59 543 查看

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 ---
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐