如何从字体文件名获取字体属性?

时间:2010-02-25 03:22:25

标签: vb.net linq fonts linq-to-objects

我正在尝试使用Linq循环%windir%\ Fonts文件夹中的所有字体,并找到属性标题为“Arial”(或提供的任何字体系列名称)的字体,但我不能似乎访问字体属性(“标题”,“字体样式”,“专为”等)。

以下仅提供基本文件信息:

     Dim fontDir = Environment.GetEnvironmentVariable("windir") & "\Fonts\"
     Dim fontFiles = From file In My.Computer.FileSystem.GetFiles(fontDir)
     Dim fontInfo = From fontFile In fontFiles Select _
               My.Computer.FileSystem.GetFileInfo(fontFile)

我最喜欢的是...Where fontFile.Title = "Arial"。这里有什么建议吗?

我需要这样做的原因是找到一个具有一个或多个属性的属性,比如Title,然后将该字体文件物理复制到另一个目录。

2 个答案:

答案 0 :(得分:4)

您可以使用framwework System.Drawing.Text.InstalledFontCollection类来索取已安装的字体,而不是这样做。获取列表并使用linq执行该操作。

或者,按照上面的方式进行操作,您必须将字体加载到System.Drawing.Text.PrivateFontCollection然后应用查询,就像上面一样找到字体。

编辑添加此内容,以便其他人可以轻松发现: 要查找文件关联,我必须通过枚举这些注册表项中的一个或两个来查找字体名称及其相应的字体文件。字体文件夹始终位于“%Windows%\ Fonts”

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts

答案 1 :(得分:2)

您可能应该使用System.Drawing.Text.InstalledFontCollection类而不是直接探测文件系统。然后你可以这样做:

var arialFontFamilies = from fontFamily in new InstalledFontCollection().Families
                        where fontFamily.Name.Contains("Arial");

如果要访问更多属性,可以创建Font对象:

var arialFonts = from fontFamily in new InstalledFontCollection().Families
                 where fontFamily.Name.Contains("Arial")
                 select new Font(fontFamily, FontSize.Regular);

如果您仍需要从磁盘上的任何位置访问自定义字体集,则可以使用PrivateFontCollection类:

var fontFiles = from fileInfo in (from file in My.Computer.FileSystem.GetFiles(fontDir) select Computer.FileSystem.GetFileInfo(file));

var privateFonts = new PrivateFontCollection();
foreach (var fontFile in fontFiles)
{
    privateFonts.AddFontFile(fontFile.FullName);
}

var arialFonts = from fontFamily in new privateFonts.Families
                 where fontFamily.Name.Contains("Arial")
                 select new Font(fontFamily, FontSize.Regular);