C# 代码之美~

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.Xml;
using System.IO;
using System.Diagnostics;
/*! @mainpage 对PhoneAppDetail表生成静态json文件
*
* <table>
* <tr><th>Project <td>[PhoneAppConsole]
* <tr><th>Author <td>[冯如德]
* <tr><th>Source <td>E:\\GetPhoneApp接口文档\\PhoneAppConsole\\
* </table>
*
* [生成PhoneAppDetail静态json文件]
*
* @section features 功能描述
*
* - [功能描述1]针对PhoneAppDetail表中isClose为True的应用,根据群分Group,区域District,系统版本SysVersionID,固件版本HardWareID枚举所有可能出现的Json。
* - [功能描述2]生成各个Json文件json.txt存储在相对应的【Group\\Districts\\SysVersionID\\HardWareID】下。
*
* @section usage [用法描述]
*
* <ol>
* <li>[使用步骤 1]
* <pre>[使用步骤 1 的样例] 本程序周期性运行,检测PhoneAppDetail是否有更新,如有更新将自动重新生成所有目录和目录下得json.txt。</pre>
* <li>[使用步骤 2]
* <pre>[使用步骤 2 的样例] 略。</pre>
* </ol>
*
* @section notes 注意事项
* [注意事项描述]略。
*
*/
namespace PhoneAppConsole
{
/// <summary>
/// 生成PhoneAppDetail静态json文件
/// </summary>
/// <Author> frd 2012-2-17 16:49</Author>
class Program
{
/// <summary>
/// 程序入口函数.
/// </summary>
/// <param name="args">The args.</param>
/// <Author> frd 2012-2-16 17:04</Author>
static void Main(string[] args)
{
//记录运行时间
Stopwatch myStopW = new Stopwatch();
myStopW.Start();
#region 判断最近更新时间,看是否要更新生成的文件
string connstr = string.Empty;
try
{
connstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.Trim();
}
catch
{
Console.WriteLine("获取数据库连接出错!程序中断!");
return;
}
string updateTimeSql = @"SELECT TOP 1 [UpdateTime] FROM [EsurfingApp].[dbo].[PhoneAppDetail] ORDER BY [UpdateTime] DESC";
DataTable dt_UpdateTime = CallCenter.DBHelper.ExecSql(updateTimeSql, connstr, CallCenter.DBHelper.OperateType.Select) as DataTable;
if (null == dt_UpdateTime || dt_UpdateTime.Rows.Count <= 0)
{
Console.WriteLine("获取数据表最近更新时间失败,请确认!");
return;
}
string latestUpdateTime_Str = string.Empty;
try
{
latestUpdateTime_Str = ConfigurationManager.AppSettings["latestUpdateTime"].ToString().Trim();
}
catch
{
Console.WriteLine("获取本地最近更新时间出错!程序中断!");
return;
}
DateTime latestUpdateDateTime;
DateTime dbUpdateTime;
DateTime.TryParse(latestUpdateTime_Str, out latestUpdateDateTime);
DateTime.TryParse(dt_UpdateTime.Rows[0]["UpdateTime"].ToString().Trim(), out dbUpdateTime);
if (DateTime.Compare(latestUpdateDateTime, dbUpdateTime) >= 0)
{
Console.WriteLine("文件已是最新,不用重新生成!");
return;
}
else
{

ConfigSetValue(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName, "latestUpdateTime", dbUpdateTime.ToString());
}
string savaFilePath = string.Empty;
try
{
savaFilePath = ConfigurationManager.AppSettings["FileSavePath"].ToString().Trim();
if (Directory.Exists(savaFilePath))
{
Console.WriteLine("Delete原数据img...");
Directory.Delete(savaFilePath, true);
}
Console.WriteLine("删除原数据成功!");
}
catch
{
Console.WriteLine("请先在配置文件中配置生成的文件要保存在的位置!");
return;
}
#endregion

List<string> GroupList = new List<string>();
List<string> DistrictList = new List<string>();
List<string> SysVersion = new List<string>();
List<string> HardVersion = new List<string>();

string _status = "";
string _decription = "";
string _appname = "";
string _apppakname = "";
string _appversion = "";
string _appimgurl = "";
string _appapkurl = "";
string _appapksize = "";
string _md5 = "";

string selectGroupSQL = @"SELECT DISTINCT [Group] FROM [EsurfingApp].[dbo].[PhoneAppDetail] WHERE [ClientType]= 2";
string selectDistrictSQL = @"SELECT DISTINCT [Districts] FROM [EsurfingApp].[dbo].[PhoneAppDetail] WHERE [ClientType]= 1";
string selectSysVersionSQL = @"SELECT DISTINCT [SysVersionID] FROM [EsurfingApp].[dbo].[PhoneAppDetail]";
string selectHardWareSQL = @"SELECT DISTINCT [HardWareID] FROM [EsurfingApp].[dbo].[PhoneAppDetail]";
string selectAllApp = @"SELECT [SysVersionID]
,[HardWareID]
,[Districts]
,[Group]
,[AppName]
,[AppApkname]
,[AppVersion]
,[AppImgUrl]
,[AppApkUrl]
,[AppApkSize]
,[Md5]
,[ClientType]
FROM [EsurfingApp].[dbo].[PhoneAppDetail] WHERE [IsClose]=1
";

#region 枚举不重复的各个列表
GetList(selectDistrictSQL, connstr, "Districts", ref DistrictList);
if (!DistrictList.Contains("0"))
DistrictList.Add("0");
DistrictList.Sort();
GetList(selectGroupSQL, connstr, "Group", ref GroupList);
if (!GroupList.Contains("0"))
GroupList.Add("0");
GroupList.Sort();
GetList(selectSysVersionSQL, connstr, "SysVersionID", ref SysVersion);
if (!SysVersion.Contains("0"))
SysVersion.Add("0");
SysVersion.Sort();
GetList(selectHardWareSQL, connstr, "HardWareID", ref HardVersion);
if (!HardVersion.Contains("0"))
HardVersion.Add("0");
HardVersion.Sort();
#endregion

StringBuilder jason = new StringBuilder();
StringBuilder _appListJason = new StringBuilder();
DataTable dt_All = CallCenter.DBHelper.ExecSql(selectAllApp, connstr, CallCenter.DBHelper.OperateType.Select) as DataTable;
if (null == dt_All || dt_All.Rows.Count <= 0)
{
Console.WriteLine("应用列表为空,请确认!");
return;
}
//表中各个项为Nll的值赋值为"0",并且在每想中增加一个"0"项,"0"表示全国
for (int i = 0; i < dt_All.Rows.Count; i++)
{
if (string.IsNullOrEmpty(dt_All.Rows[i]["SysVersionID"].ToString()))
dt_All.Rows[i]["SysVersionID"] = "-1";
if (string.IsNullOrEmpty(dt_All.Rows[i]["HardWareID"].ToString()))
dt_All.Rows[i]["HardWareID"] = "-1";
if (string.IsNullOrEmpty(dt_All.Rows[i]["Group"].ToString()))
dt_All.Rows[i]["Group"] = "-1";
if (string.IsNullOrEmpty(dt_All.Rows[i]["Districts"].ToString()))
dt_All.Rows[i]["Districts"] = "-1";
}

int DirectoryCount = 0;
//开始笛卡尔积全乘式生成对应的jsion.txt
for (int i = 0; i < GroupList.Count; i++)
{
for (int j = 0; j < DistrictList.Count; j++)
{
for (int k = 0; k < SysVersion.Count; k++)
{
for (int l = 0; l < HardVersion.Count; l++)
{
jason.Clear(); _appListJason.Clear();
for (int r = 0; r < dt_All.Rows.Count; r++)
{
//如果群分、区域、系统版本、硬件都匹配,则记录一个json的appList节点,否则跳过
//逻辑:首先判断每个应用的推送类型ClientType,如果为2,则为群推送Group,如果为1,则为区域推送Districts,其他为全国推送
//确定了ClientType推送策略后,再确定推送指定的系统版本SysVersion、固件版本HardWareVersion。
if ("2" == dt_All.Rows[r]["ClientType"].ToString())
{

if (("," + dt_All.Rows[r]["Group"].ToString() + ",").Contains("," + GroupList[i] + ",")
&& ("," + dt_All.Rows[r]["SysVersionID"].ToString() + ",").Contains("," + SysVersion[k] + ",")
&& ("," + dt_All.Rows[r]["HardWareID"].ToString() + ",").Contains("," + HardVersion[l] + ","))
{
_appname = dt_All.Rows[r]["AppName"].ToString();
_apppakname = dt_All.Rows[r]["AppApkname"].ToString();
_appversion = dt_All.Rows[r]["AppVersion"].ToString();
_appimgurl = dt_All.Rows[r]["AppImgUrl"].ToString();
_appapkurl = dt_All.Rows[r]["AppApkUrl"].ToString();
_appapksize = dt_All.Rows[r]["AppApkSize"].ToString();
_md5 = dt_All.Rows[r]["Md5"].ToString();
}
else
{
continue;
}
}
else if ("1" == dt_All.Rows[r]["ClientType"].ToString())
{
if (("," + dt_All.Rows[r]["Districts"].ToString() + ",").Contains("," + DistrictList[j] + ",")
&& ("," + dt_All.Rows[r]["SysVersionID"].ToString() + ",").Contains("," + SysVersion[k] + ",")
&& ("," + dt_All.Rows[r]["HardWareID"].ToString() + ",").Contains("," + HardVersion[l] + ","))
{
_appname = dt_All.Rows[r]["AppName"].ToString();
_apppakname = dt_All.Rows[r]["AppApkname"].ToString();
_appversion = dt_All.Rows[r]["AppVersion"].ToString();
_appimgurl = dt_All.Rows[r]["AppImgUrl"].ToString();
_appapkurl = dt_All.Rows[r]["AppApkUrl"].ToString();
_appapksize = dt_All.Rows[r]["AppApkSize"].ToString();
_md5 = dt_All.Rows[r]["Md5"].ToString();
}
else
{
continue;
}
}
else
{
if (("," + dt_All.Rows[r]["SysVersionID"].ToString() + ",").Contains("," + SysVersion[k] + ",")
&& ("," + dt_All.Rows[r]["HardWareID"].ToString() + ",").Contains("," + HardVersion[l] + ","))
{
_appname = dt_All.Rows[r]["AppName"].ToString();
_apppakname = dt_All.Rows[r]["AppApkname"].ToString();
_appversion = dt_All.Rows[r]["AppVersion"].ToString();
_appimgurl = dt_All.Rows[r]["AppImgUrl"].ToString();
_appapkurl = dt_All.Rows[r]["AppApkUrl"].ToString();
_appapksize = dt_All.Rows[r]["AppApkSize"].ToString();
_md5 = dt_All.Rows[r]["Md5"].ToString();
}
else
{
continue;
}
}
_appListJason.Append(WriteAppListJson(_appname, _apppakname, _appversion, _appimgurl, _appapkurl, _appapksize, _md5));
}
//如果appList应用列表不为空,则表示获取应用成功,否则失败
if (_appListJason == null || _appListJason.Length <= 0)
{
_status = "1";
_decription = "失败";
}
else
{
_appListJason = _appListJason.Remove(_appListJason.Length - 1, 1);
_status = "0";
_decription = "成功";
}
jason.Append(@"{" + ConbineString("status") + ":" + ConbineString(_status) + ",");
jason.Append(ConbineString("decription") + ":" + ConbineString(_decription) + ",");
jason.Append(ConbineString("msg") + ":" + ConbineString(GetMsg(connstr)) + ",");
jason.Append(ConbineString("appList") + ":" + @"[");
jason.Append(_appListJason);
jason.Append(@"]");
jason.Append(@"}");
string path = savaFilePath + GroupList[i] + "\\" + DistrictList[j] + "\\" + SysVersion[k] + "\\" + HardVersion[l] + "\\";
WriteJson(path, JsonToBase64String(jason.ToString()));
DirectoryCount++;
Console.WriteLine("完成写入json:" + path);
}
}
}
}
myStopW.Stop();
long eTime = myStopW.ElapsedMilliseconds;
Console.Write("程序共运行: " + (eTime / 1000).ToString() + " 秒," + "共生成: " + DirectoryCount.ToString() + " 个Jason.");
Console.Read();
}

/// <summary>
/// 将Json转换成Base64码.
/// </summary>
/// <param name="jason">Json内容.</param>
/// <returns></returns>
/// <Author> frd 2012-2-17 16:14</Author>
private static string JsonToBase64String(string jason)
{
byte[] jsonByte = System.Text.Encoding.UTF8.GetBytes(jason.ToString());
string jason64 = Convert.ToBase64String(jsonByte);
return jason64;
}

/// <summary>
/// 写Json.txt文件
/// </summary>
/// <param name="path">The path.</param>
/// <param name="content">The content.</param>
/// <Author> frd 2011-11-714:16</Author>
private static void WriteJson(string path, string content)
{
if (Directory.Exists(path))
path = path + "json.txt";
else
{
Directory.CreateDirectory(path);
path = path + "json.txt";
}
FileStream fs = null; ;
StreamWriter sr = null;
try
{
fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
sr = new StreamWriter(fs);
sr.Write(content);
}
catch
{
Console.WriteLine("写Json是出错,请确认!");
return;
}
finally
{
sr.Close();
fs.Close();
}
}

/// <summary>
/// 获取应用消息.
/// </summary>
/// <param name="connstr">数据库连接字符串.</param>
/// <returns></returns>
/// <Author> frd 2012-2-14 17:27</Author>
private static string GetMsg(string connstr)
{
string msg = "appMsg";
string getMsgSql = @"SELECT TOP 1 [CSValue]
FROM [EsurfingApp].[dbo].[ClientSetting]
WHERE CSKey='PhoneAppMsg'
";
DataTable dt_Msg = CallCenter.DBHelper.ExecSql(getMsgSql, connstr, CallCenter.DBHelper.OperateType.Select) as DataTable;
if (null == dt_Msg || dt_Msg.Rows.Count <= 0)
return "0";
msg = dt_Msg.Rows[0]["CsValue"].ToString();
return msg;
}

/// <summary>
/// 获取群组,区域、系统、硬件不重复枚举列表.
/// </summary>
/// <param name="sql">在数据库中查询语句.</param>
/// <param name="connstr">数据库连接字符串.</param>
/// <param name="toGetItem">具体哪个字段,如区域、群组、系统、硬件.</param>
/// <param name="toReturnList">操作列表.</param>
/// <Author> frd 2012-2-16 16:46</Author>
private static void GetList(string sql, string connstr, string toGetItem, ref List<string> toReturnList)
{
DataTable dt_District = CallCenter.DBHelper.ExecSql(sql, connstr, CallCenter.DBHelper.OperateType.Select) as DataTable;
if (dt_District == null || dt_District.Rows.Count <= 0)
{
toReturnList.Add("0");//如果没有区域ID,则为0,及全国。
}
else
{
string str = string.Empty;
for (int i = 0; i < dt_District.Rows.Count; i++)
{
if (string.IsNullOrEmpty(dt_District.Rows[i][toGetItem].ToString()))
continue;
str += dt_District.Rows[i][toGetItem].ToString() + ",";
}
if (string.IsNullOrEmpty(str))
{
toReturnList.Add("0");//如果没有区域ID,则为0,及全国。
}
else
{
str = str.Substring(0, str.Length - 1);
toReturnList = str.Split(',').ToList<string>();
}
}
//删除重复的
toReturnList = toReturnList.Distinct<string>().ToList<string>();
}

/// <summary>
/// 返回的Json.
/// </summary>
/// <param name="appname">应用名称.</param>
/// <param name="apppakname">应用pak名称.</param>
/// <param name="appversion">版本号.</param>
/// <param name="appimgurl">应用图片下载地址.</param>
/// <param name="appapkurl">应用apk文件下载地址.</param>
/// <param name="appapksize">文件大小.</param>
/// <param name="md5">文件MD5值.</param>
/// <returns></returns>
/// <Author> frd 2012-1-4 10:59</Author>
private static StringBuilder WriteAppListJson(string appname, string apppakname, string appversion, string appimgurl, string appapkurl, string

appapksize, string md5)
{
StringBuilder appListJason = new StringBuilder();
appListJason.Append("{");
appListJason.Append(ConbineString("appname") + ":" + ConbineString(appname) + ",");
appListJason.Append(ConbineString("apppakname") + ":" + ConbineString(apppakname) + ",");
appListJason.Append(ConbineString("appversion") + ":" + ConbineString(appversion) + ",");
appListJason.Append(ConbineString("appimgurl") + ":" + ConbineString(appimgurl) + ",");
appListJason.Append(ConbineString("appapkurl") + ":" + ConbineString(appapkurl) + ",");
appListJason.Append(ConbineString("appapksize") + ":" + ConbineString(appapksize) + ",");
appListJason.Append(ConbineString("md5") + ":" + ConbineString(md5));
appListJason.Append("},");
return appListJason;
}

/// <summary>
/// 为字符串加入双引号.
/// </summary>
/// <param name="sourceString">目标字符串.</param>
/// <returns></returns>
/// <Author> frd 2012-1-4 11:05</Author>
private static string ConbineString(string sourceString)
{
return "\"" + sourceString + "\"";
}

/// <summary>
/// 写数据表最近更新时间到本地AppConfig
/// </summary>
/// <param name="strExecutablePath">文件路径</param>
/// <param name="AppKey">appSetting的key.</param>
/// <param name="AppValue">appSetting的value.</param>
/// <Author> frd 2012-1-4 11:05</Author>
private static void ConfigSetValue(string strExecutablePath, string AppKey, string AppValue)
{
XmlDocument xDoc = new XmlDocument();
//获取可执行文件的路径和名称
xDoc.Load(strExecutablePath + ".config");

XmlNode xNode;
XmlElement xElem1;
XmlElement xElem2;
xNode = xDoc.SelectSingleNode("//appSettings");
xElem1 = (XmlElement)xNode.SelectSingleNode("//add[@key='" + AppKey + "']");
if (xElem1 != null)
{
xElem1.SetAttribute("key", AppKey);
xElem1.SetAttribute("value", AppValue);
}
else
{
xElem2 = xDoc.CreateElement("add");
xElem2.SetAttribute("key", AppKey);
xElem2.SetAttribute("value", AppValue);
xNode.AppendChild(xElem2);
}
xDoc.Save(strExecutablePath + ".config");
}
}
}

转载于:https://www.cnblogs.com/tsunami/archive/2012/02/24/2367178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值