using System;
using System.IO;
using System.Text;
namespace readmysic
{
class Program
{
//生成音乐sql脚本
static void Main(string[] args)
{
// string path = "G:\\ftpmusic";
// string path2 = "G:\\已上传\\";
string path = "G:\\ftpmusic"; //本地音乐文件路径
int musicid = 1;//插入数据库表(music)主键开始id
string sql = "";
DirectoryInfo filepath = new DirectoryInfo(path);
FileInfo[] files = filepath.GetFiles();
foreach(FileInfo f in files){
string tex = f.Extension;
string name = f.Name;
if(tex == ".mp3"){
string temp = name.Split('.')[0];
string title = "";
string songer = "";
if(temp.IndexOf('-') > 0){
songer = temp.Split('-')[0];
title = temp.Split('-')[1];
}else{
title = temp;
}
string temsql = "insert into music(id,name,title,songer,totalPlay) VALUES ({0},'{1}','{2}','{3}',0);\n";
temsql = string.Format(temsql,musicid,name,title,songer);
sql+=temsql;
musicid++;
}
//删除重复文件
/* string filetem = path2 + name;
if(File.Exists(filetem)){
Console.WriteLine(name);
File.Delete(filetem);
} */
//编码格式转换
if(f.Extension == ".lrc"){
FileStream fs = new FileStream(f.FullName,FileMode.Open);
Encoding tr = GetType(fs);
Console.WriteLine(name+tr.BodyName);
if(tr.BodyName == "gb2312"){
gb2312toutf8(f.FullName);
}
}
}
Console.Write(sql);
string sqlname = "G:\\ftpmusic\\temsql.txt";//生成的脚本文件地址
Writesql(sqlname,sql);
}
/// <summary>
/// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型
/// </summary>
/// <param name="FILE_NAME">文件路径</param>
/// <returns>文件的编码类型</returns>
public static System.Text.Encoding GetType(string FILE_NAME)
{
FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
Encoding r = GetType(fs);
fs.Close();
return r;
}
/// <summary>
/// 通过给定的文件流,判断文件的编码类型
/// </summary>
/// <param name="fs">文件流</param>
/// <returns>文件的编码类型</returns>
public static System.Text.Encoding GetType(FileStream fs)
{
byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
Encoding reVal = Encoding.Default;
BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
int i;
int.TryParse(fs.Length.ToString(), out i);
byte[] ss = r.ReadBytes(i);
if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
{
reVal = Encoding.UTF8;
}
else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
{
reVal = Encoding.BigEndianUnicode;
}
else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
{
reVal = Encoding.Unicode;
}
else if(ss[0] == 91 && ss[1] == 116 && ss[2] == 105){
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
reVal = Encoding.GetEncoding("GB2312");
}
r.Close();
return reVal;
}
/// <summary>
/// 判断是否是不带 BOM 的 UTF8 格式
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static bool IsUTF8Bytes(byte[] data)
{
int charByteCounter = 1;
//计算当前正分析的字符应还有的字节数
byte curByte; //当前分析的字节.
for (int i = 0; i < data.Length; i++)
{
curByte = data;
if (charByteCounter == 1)
{
if (curByte >= 0x80)
{
//判断当前
while (((curByte <<= 1) & 0x80) != 0)
{
charByteCounter++;
}
//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X
if (charByteCounter == 1 || charByteCounter > 6)
{
return false;
}
}
}
else
{
//若是UTF-8 此时第一位必须为1
if ((curByte & 0xC0) != 0x80)
{
return false;
}
charByteCounter--;
}
}
if (charByteCounter > 1)
{
throw new Exception("非预期的byte格式");
}
return true;
}
/// <summary>
/// 实现gb2312歌词转utf8
/// </summary>
/// <param name="path">歌词路径</param>
private static void gb2312toutf8(string path)
{
var data = File.ReadAllBytes(path);
System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
data = Encoding.UTF8.GetBytes(Encoding.GetEncoding("GB2312").GetString(data));
File.WriteAllBytes(path, data);
}
//生成脚本文件
public static void Writesql(string path,string sql)
{
FileStream fs = new FileStream(path, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
//开始写入
sw.Write(sql);
//清空缓冲区
sw.Flush();
//关闭流
sw.Close();
fs.Close();
}
}
}