Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieve Filename of a font

I would like to get the filename of a font. This can't be that hard... I am aware, there is a very similar question already, but the answer to that question just can't be it.

What I want to do is to send a Font file over TCP/IP to an other client, if he requests it. I select the desired font over a FontDialog, I can get the FontName from the framework. I can't find the font file in a way that I can say will work most of the time.

Where does .NET know which fonts are installed on the system? It can't be that the framework relies on a solution which does not work all the time, like the solution on CodeProject and suggested in Stackoverflow. There must be a secure way to retrieve the font file. The FontDialog can list them all in a box and the fonts installed must have a path to their file.

Anyone interested in helping me?

enter image description here

like image 304
El Mac Avatar asked Jan 23 '26 00:01

El Mac


1 Answers

using System;
using System.Drawing;
using System.Text.RegularExpressions;
using Microsoft.Win32
public static string GetSystemFontFileName(Font font)
{
    RegistryKey fonts = null;
    try{
        fonts = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\Fonts", false);
        if(fonts == null)
        {
            fonts = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Fonts", false);
            if(fonts == null)
            {
                throw new Exception("Can't find font registry database.");
            }
        }
        
        string suffix = "";
        if(font.Bold)
            suffix += "(?: Bold)?";
        if(font.Italic)
            suffix += "(?: Italic)?";
        
        var regex = new Regex(@"^(?:.+ & )?"+Regex.Escape(font.Name)+@"(?: & .+)?(?<suffix>"+suffix+@") \(TrueType\)$");
        
        string[] names = fonts.GetValueNames();
        
        string name = names.Select(n => regex.Match(n)).Where(m => m.Success).OrderByDescending(m => m.Groups["suffix"].Length).Select(m => m.Value).FirstOrDefault();
        
        if(name != null)
        {
            return fonts.GetValue(name).ToString();
        }else{
            return null;
        }
    }finally{
        if(fonts != null)
        {
            fonts.Dispose();
        }
    }
}
like image 61
IS4 Avatar answered Jan 25 '26 15:01

IS4



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!