第一、开发原因:
要做一个前台显示服务器文件的网页,想用JS控件做,数据格式使用JSON。所以就写将某目录转化成JSON字符串,但是突然觉得拼凑太啰嗦,而且定制化太高,不灵活,所以索性就写将C#中的DirectoryInfo实例递归下去找到所有子文件夹和文件,然后输出成JSON字符串。
紧接着,发现很多C#数据模型都是一样的结构,比如SHarepoint中的网站和子网站,每个网站有列表或文档库。那何不扩展一下呢。
第二、基本原理:
使用Type.InvokeMember()执行实例的方法和取得属性。
string path = @"E:\Work\test"; DirectoryInfo folder = new DirectoryInfo(path); Type type = foldera.GetType(); FileInfo[] files = (FileInfo[])type.InvokeMember("GetFiles", BindingFlags.Default | BindingFlags.InvokeMethod, null, folder, new object[] { });
String Name = (String)type.InvokeMember("Name", BindingFlags.Default | BindingFlags.GetProperty, null, folder, new object[] { });
第三、全部代码:
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Reflection; namespace GetFolderJsonData { class Program { public static string[] ZIJINames = new string[] { "Folder" }; public static string[] FUSHUNames = new string[] { "Files" }; public static string[] ZIJIMethods = new string[] { "GetDirectories" }; public static string[] FUSHUMethods = new string[] { "GetFiles" }; public static string[] ZIJIFields = new string[] { "Name" }; public static string[] FUSHUFields = new string[] { "Name", "Extension" }; public static string resultJson = ""; static void Main(string[] args) { string path = @"E:\Work_28528033\test"; DirectoryInfo foldera = new DirectoryInfo(path); string dd = "GetFiles"; Type type = foldera.GetType(); FileInfo[] files = (FileInfo[])type.InvokeMember(dd, BindingFlags.Default | BindingFlags.InvokeMethod, null, foldera, new object[] { }); resultJson += "{"; GetJsonDataFromObject(foldera); resultJson += "}"; Write(); } public static void Write() { FileStream fs = new FileStream(@"E:\Work_28528033\result.txt", FileMode.Create); //获得字节数组 byte[] data = System.Text.Encoding.Default.GetBytes(resultJson); //开始写入 fs.Write(data, 0, data.Length); //清空缓冲区、关闭流 fs.Flush(); fs.Close(); } //public static string GetJsonData(string path) //{ // string resultJson="[{"; // DirectoryInfo folder = new DirectoryInfo(path); // if (folder.GetDirectories().Length > 0) // { // resultJson += "Folder:"; // foreach (DirectoryInfo f in folder.GetDirectories()) // { // resultJson += ""; // GetJsonData(folder.FullName); // } // resultJson += ""; // } // if (folder.GetFiles().Length>0) // { // resultJson += ""; // foreach (FileInfo file in folder.GetFiles()) // { // resultJson += ""; // } // resultJson += ""; // } // return resultJson += "}]"; //} public static string GetJsonDataFromObject(object folder) { Type type = folder.GetType(); int diguiInt = -1; foreach (string ZIJIMethodsItem in ZIJIMethods) { diguiInt++; object[] folders = (object[])type.InvokeMember(ZIJIMethodsItem, BindingFlags.Default | BindingFlags.InvokeMethod, null, folder, new object[] { }); if (folders.Length>0) { resultJson += ZIJINames[diguiInt] + ":["; foreach (object dir in folders) { resultJson += "{"; Type diguiType = dir.GetType(); foreach (string ZIJINamesItem in ZIJIFields) { resultJson += ZIJINamesItem+":\""; resultJson += diguiType.InvokeMember(ZIJINamesItem, BindingFlags.Default | BindingFlags.GetProperty, null, dir, new object[] { }).ToString()+"\","; } GetJsonDataFromObject(dir); resultJson += "},"; } resultJson = resultJson.Substring(0, resultJson.Length - 1); resultJson += "],"; } } int FUSHUMethodsInt = -1; foreach (string FUSHUMethodsItem in FUSHUMethods) { FUSHUMethodsInt++; object[] files = (object[])type.InvokeMember(FUSHUMethodsItem, BindingFlags.Default | BindingFlags.InvokeMethod, null, folder, new object[] { }); if (files.Length>0) { resultJson +=FUSHUNames[FUSHUMethodsInt] + ":["; foreach (object fileItem in files) { resultJson += "{"; Type proType = fileItem.GetType(); foreach (string FUSHUFieldsItem in FUSHUFields) { resultJson += FUSHUFieldsItem + ":\""; resultJson += proType.InvokeMember(FUSHUFieldsItem, BindingFlags.Default | BindingFlags.GetProperty, null, fileItem, new object[] { }).ToString() + "\","; } resultJson = resultJson.Substring(0, resultJson.Length - 1); resultJson += "},"; } resultJson = resultJson.Substring(0, resultJson.Length - 1); resultJson += "]"; } } return resultJson; } } }
结束语:
http://www.bejson.com/ JSON格式化工具(随便搜了一个,不一定是最好的)
使用:
ZIJI代表与与传入类型相同。
FUSHU代表这种类型实例包含的另外一种类型的实例。
Field是字段。
Name是显示在JSON中的名字。Name与Method相对应。
如果还是看不懂那太正常了,自己做一个文件夹试试吧。
附上测试文件夹,工程代码,得到结果:
{
Folder: [
{
Name: "1.1F",
Folder: [
{
Name: "1.1.1F",
Files: [
{
Name: "1.1.1.1 (1).txt",
Extension: ".txt"
},
{
Name: "1.1.1.1 (2).txt",
Extension: ".txt"
},
{
Name: "1.1.1.1.txt",
Extension: ".txt"
}
]
}
],
Files: [
{
Name: "1.1.1.txt",
Extension: ".txt"
},
{
Name: "1.1.2.txt",
Extension: ".txt"
},
{
Name: "1.1.3.txt",
Extension: ".txt"
}
]
},
{
Name: "1.2F",
Files: [
{
Name: "1.2.1.txt",
Extension: ".txt"
},
{
Name: "1.2.2.txt",
Extension: ".txt"
},
{
Name: "1.2.3.txt",
Extension: ".txt"
}
]
}
],
Files: [
{
Name: "1.1.txt",
Extension: ".txt"
},
{
Name: "1.2.txt",
Extension: ".txt"
},
{
Name: "1.3.txt",
Extension: ".txt"
}
]
}
http://files.cnblogs.com/files/yixiaozi/GetFolderJsonData.rar
http://files.cnblogs.com/files/yixiaozi/GetFolderJsonDatatestFolder.rar