- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们创建了大量的字体供短期使用。字体嵌入在文档中。如果不再使用,我想删除字体文件。我们应该怎么做?以下简化代码不起作用:
PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddFontFile(fontFile);
FontFamily family = pfc.Families[0];
Console.WriteLine(family.GetName(0));
family.Dispose();
pfc.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
File.Delete(fontFile);
文件删除失败,因为文件被锁定。我还能做些什么来释放文件锁?
PS:在我们使用AddMemoryFont之前。这适用于 Windows 7。但是对于 Windows 8,.NET 在第一个 FontFamily 被处理后使用错误的字体文件。因为每个文档都可以包含其他字体,所以我们需要大量的字体并且无法保存对所有字体的引用。
最佳答案
查看AddFontFile方法的代码后:
public void AddFontFile(string filename)
{
IntSecurity.DemandReadFileIO(filename);
int num = SafeNativeMethods.Gdip.GdipPrivateAddFontFile(new HandleRef(this, this.nativeFontCollection), filename);
if (num != 0)
{
throw SafeNativeMethods.Gdip.StatusException(num);
}
SafeNativeMethods.AddFontFile(filename);
}
我们看到该字体被注册了 2 次。在 GDI+ 中首先出现,在 GDI32 中出现在最后一行。这与 AddMemoryFont 方法不同。在 Dispose 方法中,它仅在 GDI+ 中未注册。这会导致 GDI32 中的泄漏。
为了弥补这一点,您可以调用以下方法:
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int RemoveFontResourceEx(string lpszFilename, int fl, IntPtr pdv);
pfc.AddFontFile(fontFile);
RemoveFontResourceEx(fontFile, 16, IntPtr.Zero);
关于c# - 如何删除 PrivateFontCollection.AddFontFile 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26671026/
当我在 Mono.net 中调用 PrivateFontCollection.AddFontFile 方法时,它总是返回标准字体系列。这个错误已经在几个网站上报告过,但据我所知没有办法解决它。该错误本
我们创建了大量的字体供短期使用。字体嵌入在文档中。如果不再使用,我想删除字体文件。我们应该怎么做?以下简化代码不起作用: PrivateFontCollection pfc = new Private
每个人,我都在使用 GDI+ 以我自己的字体呈现文本,但在使用成员函数 AddFontFile(WCHAR*) 时,我总是得到错误状态 InvalidParameter PrivateFontColl
所以我需要使用项目中包含的 font.otf 文件将 .otf 字体文件添加到 c# 中的 PrivateFontCollection。当文件在本地加载时,我在部署到我的服务器时收到以下异常。 [异常
我是一名优秀的程序员,十分优秀!