如何从命令行参数返回完整路径

时间:2014-01-24 06:54:03

标签: c# .net directory command-line-arguments

我有一个可以从资源管理器运行的应用程序,并将所选目录传递给应用程序。所以我可以使用以下代码:

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提供的正确文件夹的最简单方法是什么?

4 个答案:

答案 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