2009-12-22 57 views
-1

請只回答問題 其他方面不迴應這個問題。C#獲取特殊文件夾

讓我重新開始。我如何使用這個擴展了內部Environment.GetSpecialFolder的類?

。我不希望specialroots

root = Environment.GetFolderPath(Environment.SpecialFolder) 

,因爲我想用這個爲其他目的而不是.NET的。

例如我該如何調用(收藏夾= 6)通過一個按鈕的位置單擊?

public class EnvironmentFolders 
{ 

public enum SpecialFolder 
{ 
    AdministrativeTools = 48, 
    //{user name}\Start Menu\Programs\Administrative Tools 
    ApplicationData = 26, 
    //{user name}\Application Data 
    CommonAdministrativeTools = 47, 
    //All Users\Start Menu\Programs\Administrative Tools 
    CommonApplicationData = 35, 
    //All Users\Application Data 
    CommonDesktopDirectory = 25, 
    //All Users\Desktop 
    CommonDocuments = 46, 
    //All Users\Documents 
    CommonFavorites = 31, 
    CommonNonLocalizedStartup = 30, 
    //non localized common startup 
    CommonPrograms = 23, 
    //All Users\Programs 
    CommonStartMenu = 22, 
    //All Users\Start Menu 
    CommonStartup = 24, 
    //All Users\Startup 
    CommonTemplates = 45, 
    //All Users\Templates 
    ControlPanel = 3, 
    //My Computer\Control Panel 
    Cookies = 33, 
    DesktopDirectory = 16, 
    //{user name}\Desktop 
    Favorites = 6, 
    //{user name}\Favorites 
    Fonts = 20, 
    //windows\fonts 
    History = 34, 
    InternetCache = 32, 
    LocalApplicationData = 28, 
    //{user name}\Local Settings\Application Data (non roaming) 
    MyDocuments = 5, 
    //My Documents 
    MyPictures = 39, 
    //C:\Program Files\My Pictures 
    NetworkShortcuts = 19, 
    //{user name}\nethood 
    NonLocalizedStartup = 29, 
    //non localized startup 
    Printers = 4, 
    //My Computer\Printers 
    PrintHood = 27, 
    //{user name}\PrintHood 
    ProgramFiles = 38, 
    //C:\Program Files 
    ProgramFilesCommon = 43, 
    //C:\Program Files\Common 
    Programs = 2, 
    //Start Menu\Programs 
    Recent = 8, 
    //{user name}\Recent 
    RecycleBin = 10, 
    //{desktop}\Recycle Bin 
    SendTo = 9, 
    //{user name}\SendTo 
    StartMenu = 11, 
    //{user name}\Start Menu 
    Startup = 7, 
    //Start Menu\Programs\Startup 
    System = 37, 
    //GetSystemDirectory() 
    Templates = 21, 
    UserProfile = 40, 
    //USERPROFILE 
    Windows = 36 
    //GetWindowsDirectory() 
} 

[DllImport("shfolder.dll", CharSet = CharSet.Auto)] 
private static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, int dwFlags, StringBuilder lpszPath); 

/// <summary> 
/// Get an environment folder path for Windows environment folders 
/// </summary> 
/// <returns>A string pointing to the special path</returns> 
/// <remarks></remarks> 
public static string GetPath(SpecialFolder folder) 
{ 
    StringBuilder lpszPath = new StringBuilder(260); 
    SHGetFolderPath(IntPtr.Zero, (int)folder, IntPtr.Zero, 0, lpszPath); 
    return lpszPath.ToString(); 
} 
} 
+7

使用interop來完成.NET可以獨立完成的任務嗎?這聽起來像一個C/C++程序員的副本,他們剛剛轉移到.NET,並且無法閱讀文檔。重構! – Aaronaught 2009-12-22 16:04:50

+7

「例如,如何通過點擊按鈕來調用(收藏夾= 6)位置?」我們想要幫助,但不明白你的意思。它*聽起來像是在詢問如何使用'EnvironmentFolders'類來獲取當用戶點擊一個按鈕時當前用戶'收藏夾'文件夾的位置。 (在Windows窗體中?在ASP.NET頁面上?不知道。)這很讓人困惑,因爲我認爲所有三個答案都解釋了這一點。請嘗試重新提出問題,以便我們知道您想要做什麼。 – 2009-12-22 21:10:53

回答

31

編輯:如果你繼承你已經告訴我們,需要使用它的一些原因代碼(而不是內置,似乎做同樣的事情.NET方法) ,你應該能夠使用它像這樣:

string path = EnvironmentFolders.GetPath(EnvironmentFolders.SpecialFolders.Fonts); 

說了這麼多,該Environment類有做幾乎同樣的事情,一個公共方法,GetFolderPath

string path = Environment.GetFolderPath(Environment.SpecialFolder.Favorites); 

reflected code in .NET長相酷似你的類的代碼,但它增加了兩件事情:它驗證參數值在枚舉中定義(因爲你可以傳遞給方法的任意整數),並要求調用方具有路徑發現許可(新的FileIOPermission)。你試圖解決的最後一項要求是什麼?

兩種方法都靜態,這意味着你通過包含它們,而不是類型的實例類型訪問它們:

// Like this 
EnvironmentFolders.GetPath(...); 

// Not this 
EnvironmentFolders folders = new EnvironmentFolders(); 
folders.GetPath(...); 

請參閱.NET文檔有關Static Classes and Static Class Members以獲取更多信息。

+0

嗯,我確實需要這個班。我知道如何打電話(SpecialFolder)。我的問題是如何使用deze clas。謝謝你的反饋。 – 2009-12-22 15:51:20

8
string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.Favorites); 
2

像這樣的東西添加到您的按鈕的單擊事件。

String path = EnvironmentFolders.GetPath(EnvironmentFolders.SpecialFolder.Favorites) 
//do something with the path. 

您需要更多信息?

加在編輯:評論是正確的方法是靜態的這種方式,就可以(至少,它工作時,我嘗試在一個控制檯應用程序)。

+0

你說得對,也許這是一個基本的形式問題。 (儘管'GetPath'是'EnvironmentFolders'上的一個* static *方法。) – 2009-12-22 16:08:32