我有一个可以从资源管理器运行的应用程序,并将所选目录传递给应用程序。所以我可以使用以下代码:
private void frmMain_Shown(object sender, EventArgs e)
{
//open the dir
DirectoryInfo d = new DirectoryInfo(cmdArgs);
SelectDirectoryInTree(d);
}
如果用户选择特殊文件夹,则会失败。为这些文件夹返回的路径是不同的。因此,例如,如果用户选择Libraries\Documents
文件夹(或其中的任何其他文件夹),则返回的DirectoryInfo为::{xxxxx-xxxx-xxxxx-xxx-xxxxx}\Documents.library-ms
具体例外:
System.ArgumentException: The path is not of a legal form.
at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength)
at System.IO.Path.GetFullPathInternal(String path)
at System.IO.DirectoryInfo.Init(String path, Boolean checkHost)
at System.IO.DirectoryInfo..ctor(String path)
at FindIt.frmMain.frmMain_Shown(Object sender, EventArgs e) in d:\C#\+Other\FindIt\frmMain.cs:line 476
at System.Windows.Forms.Form.OnShown(EventArgs e)
at System.Windows.Forms.Form.CallShownEvent()
at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
获取资源管理器shell提供的正确文件夹的最简单方法是什么?
答案 0 :(得分:2)
您是否考虑过使用Windows API Code Pack?它包含Windows Shell的许多功能。
User Libraries文件夹是一个特殊的文件夹,因此它有一个特殊的解析名称
::{031E4825-7B94-4DC3-B131-E946B44C8DD5}
如果要将上述内容复制并粘贴到资源管理器或运行命令中,您将获得用户库文件夹。
使用Shell接口枚举这些文件夹,您将能够检索每个库中的所有文件夹和文件,并且每个文件夹都将解析为磁盘上的位置。实际上,每个库中的每个文件夹和文件将分别解析为解析位置,该解析位置通常是所讨论的文件和文件夹的物理(或在某些情况下,网络)位置。
然而,就枚举库中的所有文件而言,您需要使用shell API,因为它们具有特殊类型的文件夹(库将多个物理位置组合到一个“虚拟”位置。)< / p>
您应该学习解析名称。一旦你有一些解析名称,你可以用这个系统做很多有趣的事情,包括使用ShellExecuteEx(这是Win32 Api中的一个函数)打开属性表。
Windows API代码包中有一个名为“KnownFolders Browser”的示例程序,它应该为您阐明有关shell的许多内容。
答案 1 :(得分:2)
这是为了未来的人,因为这是如此古老。我按照Nathan的建议和posted a full solution with code using Windows API Code Pack处理了另一个想要类似的StackOverflow问题。看看吧!
答案 2 :(得分:0)
Windows 7中的库不是实际文件夹,而是物理文件夹的集合。因此,无法转换为标准的c:\ foldername结构。
答案 3 :(得分:0)
您可以检查该文件夹是否是特殊文件夹并相应地解决:
System.Environment.SpecialFolder
http://msdn.microsoft.com/en-us/library/system.environment.specialfolder%28v=vs.110%29.aspx
Environment.GetFolderPath(Environment.SpecialFolder)
http://msdn.microsoft.com/en-us/library/14tx8hby%28v=vs.110%29.aspx