Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何从字体文件名中获取字体属性?_Vb.net_Linq_Fonts_Linq To Objects - Fatal编程技术网

Vb.net 如何从字体文件名中获取字体属性?

Vb.net 如何从字体文件名中获取字体属性?,vb.net,linq,fonts,linq-to-objects,Vb.net,Linq,Fonts,Linq To Objects,我试图使用Linq在%windir%\fonts文件夹中循环查找所有字体,并找到属性标题为“Arial”(或提供的任何字体系列名称)的字体,但我似乎无法访问字体属性(例如“标题”、“字体样式”、“专为”等) 以下仅提供了基本的文件信息: Dim fontDir = Environment.GetEnvironmentVariable("windir") & "\Fonts\" Dim fontFiles = From file In My.Computer.FileS

我试图使用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)的字体文件,然后将该字体文件物理复制到另一个目录。

您可以使用framwork
System.Drawing.Text.InstalledFontCollection
类来请求安装的字体。获取列表并使用linq执行该操作

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

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


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

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);
如果仍然需要从磁盘上的任何位置访问自定义字体集,可以使用类:


有意思,我没想到。让我看看。不幸的是,它不起作用。它仍然没有给我标题、字体样式等字体属性。一旦找到所需的内容,我确实需要访问物理文件。例如,在本例中,我需要找到标题为Arial的字体文件,然后将字体文件复制到其他目录。如果<代码>安装C++ fOntCys具有“代码>路径< /代码>的属性,那么我肯定会使用它。我记得我在C++中已经做了一些事情。找出一些旧代码并找到了方法:)您实际上必须枚举注册表项才能找到所有字体的名称,而数据就是字体文件。HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts编写一些代码,将遍历此密钥中的所有条目。字体的路径始终为%windows%\Fonts文件夹。如果您不在受控环境中,请尝试阅读此密钥HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts。这非常好。我一直在看这把钥匙,它似乎有我所需要的,在大多数情况下。如何处理与“Name(TrueType)”模式不匹配的内容的解析?我只发现了一些奇怪的球,比如巴东和巴东切和贡苏切和贡苏切(TrueType)*、*罗马(所有res)、小字体(120)、Segoe Condensed和Courier 10,12,15。不太多,但我只是想知道是否有文档记录了字体名称在这个键中的位置,以便我可以对它们应用一些正则表达式。
var arialFonts = from fontFamily in new InstalledFontCollection().Families
                 where fontFamily.Name.Contains("Arial")
                 select new Font(fontFamily, FontSize.Regular);
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);