【问题标题】:Get Special Folder获取特殊文件夹
【发布时间】:2018-09-19 06:28:12
【问题描述】:

请回答问题 否则不回答这个问题。

让我重新开始。如何使用这个扩展了内部 Environment.GetSpecialFolder 的类?

我不想要特殊的根

root = Environment.GetFolderPath(Environment.SpecialFolder)

因为我想将其用于其他目的而不是 .net。

例如,如何通过单击按钮调用 (Favorites = 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();
}
}

【问题讨论】:

  • 使用互操作来完成 .NET 自己可以完美处理的事情?这闻起来像是刚搬到 .NET 并且懒得阅读文档的 C/C++ 程序员的 copypasta。重构!
  • "例如,我如何通过单击按钮调用 (Favorites = 6) 位置?我们想提供帮助,但不明白您的意思。 听起来就像您在询问如何在用户单击按钮时使用EnvironmentFolders 类来获取当前用户的“收藏夹”文件夹的位置。 (在 Windows 窗体中?在 ASP.NET 页面上?不知道。)这令人困惑,因为我认为所有三个答案都解释了这一点。请尝试改写问题,以便我们知道您想做什么。

标签: c#


【解决方案1】:

编辑:如果您继承了您向我们展示的代码并且出于某种原因需要使用它(而不是似乎做同样事情的内置 .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(...);

有关更多信息,请参阅有关 Static Classes and Static Class Members 的 .NET 文档。

【讨论】:

  • 我确实需要这门课。我知道如何打电话(SpecialFolder)。我的问题是如何使用 deze clas。感谢您的意见。
  • 不错的解决方案。但是我有一个问题,我怎样才能得到 RecycleBin 文件夹?
  • 如何通过Environment类获取RecycleBin路径?
【解决方案2】:
string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.Favorites);

【讨论】:

    【解决方案3】:

    这样的东西添加到你的按钮的点击事件中。

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

    您需要更多信息??

    编辑时添加:评论是正确的,方法是静态的,这种方式应该可以工作(至少,当我在控制台应用程序上尝试它时它工作)。

    【讨论】:

    • 你说得对,也许这是一个基本的表单问题。 (虽然GetPathEnvironmentFolders 上的静态 方法。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2019-05-12
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多