C#求教如何获取字体的文件名

问题描述

如题如宋体对应的是simsun.ttc用C#如何获取

解决方案

解决方案二:
用IO查找Fonts文件夹
解决方案三:

解决方案四:
引用1楼DENQH的回复:

用IO查找Fonts文件夹

我想知道的是"宋体"是如何关联上simsun.ttc就是说我用FontDialog得到"宋体"这个名称后,然后我该如何去获得simsun.ttc这个系统文件名有现成的函数或者方法吗?
解决方案五:
注册表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionFonts
解决方案六:
引用4楼hjywyj的回复:

注册表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionFonts

查过了,没有找到宋体名和simsun.ttc文件名的对应
解决方案七:
MSDN上2007年已经有人问过这个问题,如果你的英文还可以的话,可以看下地址:http://social.msdn.microsoft.com/Forums/en-US/windowsxps/thread/843d0e98-ac8e-4021-94f9-5e3130d058b9解决方案在:http://www.codeproject.com/Articles/4190/XFont-Get-font-name-and-file-information就是第一篇帖子最后一个人所说:It'snotperfect,butitworks.GoodLuck!
解决方案八:
刚好我也需要这个功能,就一次回复到位吧。以下C#代码可读取指定.ttf文件里的字体名,思路反过来:遍历<windir>Fonts目录下的所有文件,即可找到通过“字体选择器”返回的字体名的字体文件。虽然办法笨了点,但确实也没啥好办法,凑合着能用。It'snotperfect,butitworks.----------------------------------------------usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingSystem.IO;namespaceFontNameGetter{[StructLayout(LayoutKind.Sequential,Pack=0x1)]structTT_OFFSET_TABLE{publicushortuMajorVersion;publicushortuMinorVersion;publicushortuNumOfTables;publicushortuSearchRange;publicushortuEntrySelector;publicushortuRangeShift;}[StructLayout(LayoutKind.Sequential,Pack=0x1)]structTT_TABLE_DIRECTORY{publiccharszTag1;publiccharszTag2;publiccharszTag3;publiccharszTag4;publicuintuCheckSum;//ChecksumpublicuintuOffset;//OffsetfrombeginningoffilepublicuintuLength;//lengthofthetableinbytes}[StructLayout(LayoutKind.Sequential,Pack=0x1)]structTT_NAME_TABLE_HEADER{publicushortuFSelector;publicushortuNRCount;publicushortuStorageOffset;}[StructLayout(LayoutKind.Sequential,Pack=0x1)]structTT_NAME_RECORD{publicushortuPlatformID;publicushortuEncodingID;publicushortuLanguageID;publicushortuNameID;publicushortuStringLength;publicushortuStringOffset;}partialclassForm1:Form{publicForm1(){InitializeComponent();}privateTT_OFFSET_TABLEttOffsetTable;privateTT_TABLE_DIRECTORYtblDir;privateTT_NAME_TABLE_HEADERttNTHeader;privateTT_NAME_RECORDttNMRecord;privatevoidbutton1_Click(objectsender,EventArgse){FileStreamfs=newFileStream("f:\simsun.ttc",FileMode.Open,FileAccess.Read);BinaryReaderr=newBinaryReader(fs);byte[]buff=r.ReadBytes(Marshal.SizeOf(ttOffsetTable));buff=BigEndian(buff);IntPtrptr=Marshal.AllocHGlobal(buff.Length);Marshal.Copy(buff,0x0,ptr,buff.Length);TT_OFFSET_TABLEttResult=(TT_OFFSET_TABLE)Marshal.PtrToStructure(ptr,typeof(TT_OFFSET_TABLE));Marshal.FreeHGlobal(ptr);//Mustbemaj=1minor=0if(ttResult.uMajorVersion!=1||ttResult.uMinorVersion!=0)return;boolbFound=false;TT_TABLE_DIRECTORYtbName=newTT_TABLE_DIRECTORY();for(inti=0;i<ttResult.uNumOfTables;i++){byte[]bNameTable=r.ReadBytes(Marshal.SizeOf(tblDir));IntPtrptrName=Marshal.AllocHGlobal(bNameTable.Length);Marshal.Copy(bNameTable,0x0,ptrName,bNameTable.Length);tbName=(TT_TABLE_DIRECTORY)Marshal.PtrToStructure(ptrName,typeof(TT_TABLE_DIRECTORY));Marshal.FreeHGlobal(ptrName);stringszName=tbName.szTag1.ToString()+tbName.szTag2.ToString()+tbName.szTag3.ToString()+tbName.szTag4.ToString();if(szName!=null){if(szName.ToString()=="name"){bFound=true;byte[]btLength=BitConverter.GetBytes(tbName.uLength);byte[]btOffset=BitConverter.GetBytes(tbName.uOffset);Array.Reverse(btLength);Array.Reverse(btOffset);tbName.uLength=BitConverter.ToUInt32(btLength,0);tbName.uOffset=BitConverter.ToUInt32(btOffset,0);break;}}}if(bFound){fs.Position=tbName.uOffset;byte[]btNTHeader=r.ReadBytes(Marshal.SizeOf(ttNTHeader));btNTHeader=BigEndian(btNTHeader);IntPtrptrNTHeader=Marshal.AllocHGlobal(btNTHeader.Length);Marshal.Copy(btNTHeader,0x0,ptrNTHeader,btNTHeader.Length);TT_NAME_TABLE_HEADERttNTResult=(TT_NAME_TABLE_HEADER)Marshal.PtrToStructure(ptrNTHeader,typeof(TT_NAME_TABLE_HEADER));Marshal.FreeHGlobal(ptrNTHeader);bFound=false;for(inti=0;i<ttNTResult.uNRCount;i++){byte[]btNMRecord=r.ReadBytes(Marshal.SizeOf(ttNMRecord));btNMRecord=BigEndian(btNMRecord);IntPtrptrNMRecord=Marshal.AllocHGlobal(btNMRecord.Length);Marshal.Copy(btNMRecord,0x0,ptrNMRecord,btNMRecord.Length);TT_NAME_RECORDttNMResult=(TT_NAME_RECORD)Marshal.PtrToStructure(ptrNMRecord,typeof(TT_NAME_RECORD));Marshal.FreeHGlobal(ptrNMRecord);if(ttNMResult.uNameID==1){longfPos=fs.Position;fs.Position=tbName.uOffset+ttNMResult.uStringOffset+ttNTResult.uStorageOffset;char[]szResult=r.ReadChars(ttNMResult.uStringLength);if(szResult.Length!=0){inty=0;//szResultnowcontainsthefontname.//szResult即是文件中的字体名,遍历Fonts目录下的所有文件,目标就实现了}}}}}privatebyte[]BigEndian(byte[]bLittle){byte[]bBig=newbyte[bLittle.Length];for(inty=0;y<(bLittle.Length-1);y+=2){byteb1,b2;b1=bLittle[y];b2=bLittle[y+1];bBig[y]=b2;bBig[y+1]=b1;}returnbBig;}}}-----------------------------------------------别说不会用这个例子啊,仔细看下代码就知道啦。
解决方案九:
经测试,上面老外的方法不好用,不好意思。自己写了个简单的,经测可用:classFontNameFile{publicstaticstringgetFontFileName(stringfontname){stringfolderFullName=System.Environment.GetEnvironmentVariable("windir")+"\fonts";DirectoryInfoTheFolder=newDirectoryInfo(folderFullName);foreach(FileInfoNextFileinTheFolder.GetFiles()){if(NextFile.Exists){if(fontname==getFontName(NextFile.FullName))returnNextFile.FullName;}}return("");}privatestaticstringgetFontName(stringfontfilename){PrivateFontCollectionpfc=newPrivateFontCollection();try{pfc.AddFontFile(fontfilename);}catch(Exceptionex){return"";}return(pfc.Families[0].Name);}}
解决方案十:
PrivateFontCollection的AddFontFile方法还是不支持很多ttf字体!

时间: 2024-10-02 18:30:38

C#求教如何获取字体的文件名的相关文章

【方法整理】Oracle 获取trace跟踪文件名的几种常用方式

[方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1  BLOG文档结构图     2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① trace跟踪文件的获取   Tips: ① 本文在itpub(http://blog.itpub.net/26736162).博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同

Linux系统中获取路径的文件名的方法

  这篇文章主要介绍了Linux系统中获取路径的文件名的方法,文中总结出了两条,需要的朋友可以参考下 代码如下: [root@dabu.info ]#basename /root/aaa/bbb/dabu.txt 显示: 代码如下: dabu.txt #获取路径的文件名 shell脚本中如何获得脚本文件所在路径? 方法一: 代码如下: [root@dabu.info ]#DIR=$(cd "$(dirname "$0")"; pwd) [root@dabu.info

C#根据网址获取域名,目录名,文件名函数

函数|文件名 #region 获取网址中域名,目录,文件名的函数   public string GetUrlDomainName(string strHtmlPagePath)  {   string   p   =   @"http://[^\.]*\.(?<domain>[^/]*)";      Regex   reg   =   new   Regex(p,RegexOptions.IgnoreCase);      Match   m   =   reg.Mat

ubuntu-c++有获取core dump文件名的的api吗

问题描述 c++有获取core dump文件名的的api吗 kernel.core_pattern定义了core dump文件格式,如果我想自己生成core文件,又不想解析kernel.core_pattern这个字符串,C++有现成的API用来获取core文件名吗? 解决方案 C++ 没有这样的功能,因为 C++ 使用在什么系统.什么环境都不清楚. 这个只能从具体系统提供的功能来分析. 解决方案二: http://blog.csdn.net/xie1xiao1jun/article/detai

c++-C++获取文件的文件名和扩展名

问题描述 C++获取文件的文件名和扩展名 如题,比如文件为123.txt,文件名为123,扩展名为txt,就这样就行,谢谢 解决方案 并且扩展名不需要那个"." 解决方案二: 文件名不要带扩展名的 解决方案三: 可以参考以下代码: /********************************************************************** brief 分离文件名称 details 给任一文件名称(诸如abc.txt),把其文件名和扩展名分离 param

vc++-setup factory7打包后,如何获取安装包文件名

问题描述 setup factory7打包后,如何获取安装包文件名 我用setup factory 7打包时,如何设置软件安装时,将安装包文件名写入安装目录里的一个txt文件里. 例如:包1:setup_123.exe ,txt写入"setup_123.exe"; 包2:setup_234.exe,txt写入"setup_234.exe". 求救!!! 解决方案 没有这个必要,因为你无非就是想知道某个安装程序是否安装了,而安装程序会添加记录到注册表的local_ma

下载文件如何获取真实的文件名

问题描述 用webclientdownloadfile下载文件如何获取真正的文件名:如下载路径是:http://xx.xx.xx/down.asp?Id=567访问这个路径是会跳转到文件的真实路径如:http://xx.xx.xx/***.doc请教如何获取***.doc的名称 解决方案 解决方案二:up解决方案三:stringfilePath=@"http://xx.xx.xx/***.doc";stringfileName=Path.GetFileName(filePath); 引

性能测试-请问loadrunner下载文件保存到本地,怎么自动获取下载的文件名和类型呢

问题描述 请问loadrunner下载文件保存到本地,怎么自动获取下载的文件名和类型呢 用loadrunner做下载文件的性能测试的时候,怎么自动获取到我下载的文件名呢? 解决方案 http://blog.csdn.net/gzh0222/article/details/6788888 解决方案二: [原创]Loadrunner下载文件,并自动生成不重复的文件名

ckfinder如何获取图片的文件名或者相对路径

问题描述 我用ckeditor和ckfinder实现图片的上传.并设置了上传文件之后文件的重命名.[sFileName=DateTime.Now.ToString("yyyyMMddHHmmssfff")+"."+sExtension;]我也设置好了上传图片之后存放的目录"~images".现在的问题是,我怎么从后台获取图片的文件名,或者图片的相对路径. 解决方案 解决方案二:....木有大神么....解决方案三:我是直接重新编译了ckfinde