字体预览工具 v1.0.0 初始版本
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace FontPreview
|
||||
{
|
||||
/// <summary>
|
||||
/// 字体清单缓存:首次扫描后落盘,后续启动直接读缓存秒显,
|
||||
/// 后台再按 文件路径/大小/修改时间 做增量对比,未变化的不重新解析。
|
||||
/// </summary>
|
||||
public class FontCache
|
||||
{
|
||||
public struct Stamp
|
||||
{
|
||||
public long Size;
|
||||
public long Mtime;
|
||||
}
|
||||
|
||||
public string RootDir;
|
||||
public List<FontItem> Items = new List<FontItem>();
|
||||
public Dictionary<string, Stamp> Stamps = new Dictionary<string, Stamp>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
private static string CachePath => Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "fontcache.txt");
|
||||
|
||||
public static bool TryLoad(string rootDir, out FontCache cache)
|
||||
{
|
||||
cache = null;
|
||||
try
|
||||
{
|
||||
if (!File.Exists(CachePath)) return false;
|
||||
string[] lines = File.ReadAllLines(CachePath, Encoding.UTF8);
|
||||
if (lines.Length < 2 || lines[0] != "#FontCache v1") return false;
|
||||
string rd = null;
|
||||
for (int i = 0; i < lines.Length; i++)
|
||||
{
|
||||
if (lines[i].StartsWith("rootdir=")) { rd = lines[i].Substring(8).Trim(); break; }
|
||||
}
|
||||
if (rd == null || !string.Equals(rd, rootDir.Trim(), StringComparison.OrdinalIgnoreCase)) return false;
|
||||
|
||||
FontCache c = new FontCache();
|
||||
c.RootDir = rootDir;
|
||||
for (int i = 0; i < lines.Length; i++)
|
||||
{
|
||||
string l = lines[i];
|
||||
if (string.IsNullOrEmpty(l) || l[0] == '#' || l.StartsWith("rootdir=")) continue;
|
||||
string[] p = l.Split('\t');
|
||||
if (p.Length < 6) continue;
|
||||
FontItem it = new FontItem { Cat = p[0], Path = p[1], Name = p[2], DisplayName = p[3] };
|
||||
c.Items.Add(it);
|
||||
long size, mt;
|
||||
if (long.TryParse(p[4], out size) && long.TryParse(p[5], out mt))
|
||||
{
|
||||
c.Stamps[it.Path] = new Stamp { Size = size, Mtime = mt };
|
||||
}
|
||||
}
|
||||
if (c.Items.Count == 0) return false;
|
||||
cache = c;
|
||||
return true;
|
||||
}
|
||||
catch { return false; }
|
||||
}
|
||||
|
||||
public static void Save(FontCache c)
|
||||
{
|
||||
try
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine("#FontCache v1");
|
||||
sb.AppendLine("rootdir=" + c.RootDir);
|
||||
foreach (FontItem it in c.Items)
|
||||
{
|
||||
Stamp st;
|
||||
c.Stamps.TryGetValue(it.Path, out st);
|
||||
string dn = (it.DisplayName ?? "").Replace("\t", " ");
|
||||
sb.Append(it.Cat).Append('\t').Append(it.Path).Append('\t')
|
||||
.Append(it.Name).Append('\t').Append(dn).Append('\t')
|
||||
.Append(st.Size).Append('\t').Append(st.Mtime).Append('\n');
|
||||
}
|
||||
string tmp = CachePath + ".tmp";
|
||||
File.WriteAllText(tmp, sb.ToString(), new UTF8Encoding(false));
|
||||
if (File.Exists(CachePath)) { File.Copy(tmp, CachePath, true); File.Delete(tmp); }
|
||||
else { File.Move(tmp, CachePath); }
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user