3

現在、すべての Open Explorer Windows の ListBox でパスを取得するために以下を使用しています。

foreach (SHDocVw.InternetExplorer j in new SHDocVw.ShellWindows()) {
    if (j.Name == "Windows Explorer") {
        ListView1.Items.Add(j.LocationURL);
    }
}

ただし、コンピューター、ごみ箱、ネットワークなどの特別なフォルダーの場所は返されません。shell:MyComputerFolderコンピューターのように自分でパスを配置できるように、これらのフォルダーを識別する方法はありますか?

4

4 に答える 4

3

Environment.GetFolderPath(Environment.SpecialFolder)メソッドを使用する必要があります

Environment.SpecialFolderは、すべてのWindowsの「特別な」フォルダー(マイドキュメント、プログラムファイル、デスクトップなど)の値を持つ列挙型です。

更新: このメソッドを使用して、特定のパスが特別なフォルダーであるかどうかを確認できます。

public static bool IsSpecialFolder(string folderPath)
{
    foreach (Environment.SpecialFolder specialFolderType in Enum.GetValues(typeof (Environment.SpecialFolder)))
    {
        var specialFolderLocation = Environment.GetFolderPath(specialFolderType);

        if(specialFolderLocation.Equals(folderPath, StringComparison.InvariantCultureIgnoreCase))
            return true;
    }

    return false;
}

たとえば、IsSpecialFolder(j.LocationURL)それぞれjを呼び出して、開いているフォルダのどれが特別なフォルダであるかを調べることができます。

于 2012-01-10T21:19:07.050 に答える
1

それを現在のシステムフォルダーの名前と比較した場合:j.LocationNameGet Current Names of Windows Special Folders、次のようにパスを手動で追加しましたnullshell:MyComputerFolder

于 2012-01-12T19:04:37.837 に答える
0

このようなEnvironment.SpecialFolder列挙を使用できます

Environment.GetFolderPath(Environment.SpecialFolder.System))

リンクには、ちなみに具体的なコード例があります。

于 2012-01-10T21:18:30.173 に答える
0

パスを取得する必要があります...しかし、コンピューター、ごみ箱、ネットワークなどの特別なフォルダーの場所は返されません。

あなたが直面している当面の問題は、ウィンドウの場所が物理ディレクトリでない場合にLocationURL返されることです。""「マイ コンピュータ」、「ごみ箱」、および「ネットワーク」の場合、これは当然のことです。これらは仮想フォルダです。それらはディスク上の場所ではないため、それらを指すパスまたは URL はありません

ただし、「ドキュメント」(これ特別なフォルダーでもありますが、ディスク上のディレクトリに対応しています) に移動すると、LocationURL引き続き"". ここではパスを提供できますが、そうしないことを選択します。これはやや意地悪なようです。

ShellWindowsがInternetExplorerobjectsを返すというドキュメントを見つけました。ShellBrowserWindow使用しているクラスのドキュメントは見つかりませんでしたInternetExplorerが、類似または同一のようです。そのため、Intellisense でプロパティ名を調べるだけでなく、参照できるドキュメントがいくつかあります。

有用に見える他の唯一のプロパティは ですLocationName。これは、仮想フォルダーまたは特別なフォルダーに対しても何かを返します。ただし、「Documents」や「Libraries」などの文字列が返されますが、これはプログラムで実際に使用できるものではありません (ロケールや Windows のバージョンによって異なります)。

リストに表示するものだけが必要な場合は、LocationNameおそらく十分でしょう。実際にパスが必要な場合は、おそらく運が悪いでしょう (前述のように、コンピューター、ごみ箱、ネットワークなどにはパスがないため、いずれにせよそうなるでしょう)。

于 2012-01-10T23:11:12.740 に答える