2010-02-25 3 views
2

Я пытаюсь использовать 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, а затем физически скопировать этот файл шрифта в другой каталог.

ответ

4

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

Мне действительно нужен доступ к физическому файлу, когда я нашел то, что мне нужно. Например, в этом случае мне нужно найти тот, у которого есть Arial в качестве заголовка, а затем скопировать файл шрифта в другой каталог. Если 'InstalledFontCollection' имеет свойство' Path', то я бы использовал его точно. –

+1

Я помню, что я сделал что-то на этом в C++. Вычистите какой-то старый код и нашли способ :) Вам действительно нужно перечислить раздел реестра, чтобы найти все имя шрифта, а данные - файл шрифта. HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fonts Напишите код, который будет проходить через все записи этого ключа. Путь к шрифту всегда находится в папке% windows% \ Fonts. Если вы не находитесь в контролируемой среде, попробуйте также прочитать этот ключ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Fonts –

+0

Это действительно хорошо. Я смотрел на этот ключ, и похоже, что он имеет то, что мне нужно, по большей части. Как вы обрабатывали разбор материалов, которые не соответствовали шаблону «* Name * (TrueType)»? Я нахожу только несколько нечетных мячей, таких как * Batang & BatangChe & Gungsuh & GungsuhChe (TrueType) *, * Roman (All res) *, * Small Fonts (120) *, * Segoe Condensed * и * Courier 10,12 , 15 *. Не так уж и много, но мне просто интересно, где-то где-то где-то описано, как имена шрифтов сидят в этом ключе, поэтому я могу применить некоторые RegEx к ним. –

2

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

Интересно, я об этом не думал. Позвольте мне проверить это. –

+0

К сожалению, это не работает. Он по-прежнему не дает мне свойств шрифта Title, Font style и т. Д. –

Смежные вопросы