代码之家  ›  专栏  ›  技术社区  ›  Todd Main

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

  •  2
  • Todd Main  · 技术社区  · 15 年前

    我正在尝试使用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" . 有什么建议吗?

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   Fadrian Sudaman    15 年前

    你可以用框架代替它 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
    
        2
  •  2
  •   jrista    15 年前

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

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

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

    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);