2012-11-28 111 views
0

我需要在我的C特定字体的路径:/窗/文件夹 下面的代码工作完美,当目标框架是4.0 但我的应用程序只能针对3.5,我需要在控制台应用程序中使用它c#访问Fonts文件夹3.5

我该如何实现这一目标?谢谢。

string arialuniTff = path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Fonts), "arial.TTF"); 

错误消息在3.5:“System.Environment.SpecialFolder”不包含一个定义

+0

我看不出为什么这不会在3.5工作...什么错误信息你好吗? – andypaxo

+0

@andypaxo我已更新错误消息 – Anuya

回答

4

的字体文件夹通常位于%windir%\Fonts,所以你应该能够得到的位置这样:

Path.Combine(
    System.Environment.GetEnvironmentVariable("windir"), 
    "Fonts"); 

它是一个虚拟文件夹,所以理论上它可能位于其他地方。在实践中,我从来没有见过这种情况发生或听说过它发生。 (微软有足够的信心在此位置引用它的“how to install a font”页面)。我敢肯定,如果你试图找到一个特定的文件名,那么你已经有了很好的错误处理功能。

赠品信息:

你可能已经知道这一点,但如果你需要知道什么类,方法等在.NET Framework的一个特定版本,你可以从MSDN找到。转到文档页面(在Environment.SpecialFolder上说这个),然后单击左上角的“.NET Framework 4.5”链接,然后选择其他版本以查看您正在查看的页面,就像它在该版本中一样。

+0

我现在正在收到类似的错误消息。错误:\t'System.Environment.SpecialFolder'没有包含'Windows'的定义 – Anuya

+0

哦,那真是愚蠢的我。我已经用另一个4.5特定的呼叫替换了4.5个特定的呼叫。等一下,我会找到一个替代方案。 – andypaxo

+0

那里。这应该在任何框架一直工作到2.0! – andypaxo

0

请参阅How to get the path to CSIDL_COMMON_DOCUMENTS in .NET 3.5?

const int CSIDL_COMMON_DOCUMENTS = 0x002e;提供的位置。

对于Fonts文件夹,使用const int CSIDL_FONTS = 0x0014;

这将是:

[DllImport("shell32.dll"), CharSet = CharSet.Auto] 
static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, uint dwFlags, [Out] StringBuilder pszPath); 

const int CSIDL_FONTS = 0x0014; 
const int CSIDL_FLAG_CREATE = 0x8000; 

StringBuilder sb = new StringBuilder(); 

int retVal = SHGetFolderPath(IntPtr.Zero, 
           CSIDL_FONTS | CSIDL_FLAG_CREATE, 
           IntPtr.Zero, 
           0, 
           sb); 
Debug.Assert(retVal >= 0); // assert that the function call succeeded 
String folderLocation = sb.ToString();