Как получить свойства шрифта из имени файла шрифта? - PullRequest
2 голосов
/ 25 февраля 2010

Я пытаюсь использовать 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 ]

4 голосов
/ 25 февраля 2010

Вместо этого вы можете использовать класс 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
2 голосов
/ 25 февраля 2010

Вы, вероятно, должны использовать класс 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);
...