2012-11-28 131 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();