5

.Net は、フォルダーを参照するための FolderBrowserDialog コントロールを提供します。ただし、これはモーダル ダイアログ ボックスです。フォームにドロップできるユーザー コントロールを作成する必要があります。そのため、すべてのローカル ドライブ、マップされたネットワーク ドライブ、UNC 共有、および Web フォルダー (WebDAV/SharePoint) を取得する必要がある独自の作成を検討してきました。Windows 7 と .Net 4.0 を使用しています。

ローカルおよびマップされたネットワーク ドライブ
DriveInfo.GetDrives() からローカル ドライブを取得できます。ただし、これらは利用可能/オンラインのドライブのみを表示しています。Windows エクスプローラーでは、切断されているか使用できないマップされたネットワーク ドライブも表示されます。

ネットワーク フォルダ/UNC 共有
これまでに確認したところ、.Net には UNC 共有を列挙するメカニズムがないようです。WNetOpenEnumおよびWNetEnumResource関数を使用してネットワークの近隣を列挙するには、Interop to Win32 API を使用する必要があるようです。私はこれを機能させましたが、別の方法がないかどうか疑問に思っていました。

Web (WebDAV) フォルダーと SharePoint
Windows エクスプローラーで、いくつかの WebDAV フォルダーを構成しました。上記WNetOpenENumと同じ Interop 呼び出しを使用するとWNetENumResource、ノード「Web Client Network」と、接続されアクセス可能な WebDAV フォルダーが表示されました。

質問

  1. 構成されているがオフラインになっている、マップされたネットワーク ドライブを取得するにはどうすればよいですか?
  2. UNC 共有を列挙する別の方法はありますか、それとも上記の相互運用呼び出しの使用に固執していますか?
  3. WNetEnumResource「Microsoft Terminal Services」の空のノードが返されました。英語のテキストに基づいてフィルタリングせずに、これをフィルタリングするにはどうすればよいですか?
  4. によって返される Web フォルダは、WNetEnumResource作成時に割り当てたユーザー フレンドリな名前ではなく、IP-Address@Port などの形式になっています\\nnn.nnn.nnn.nnn@18123。Web フォルダのわかりやすい名前を取得するにはどうすればよいですか?
  5. オフラインだった Web フォルダーはまったく表示されませんでしたが、Windows エクスプローラーには表示されています。オフラインのものを入手するための提案はありますか?
4

1 に答える 1

0

はい、これを行うことができます。このサイトを見てください。VB と C# でそれを行う方法が示されます。

ネットワーク ドライブ/共有の列挙

これは、codeproject からも試すことができるサンプル アプリです。

//

// Enumerate shares on local computer

//

Console.WriteLine("\nShares on local computer:");
ShareCollection shi = ShareCollection.LocalShares;
if (shi != null) 
{
    foreach(Share si in shi) 
    {
        Console.WriteLine("{0}: {1} [{2}]", 
            si.ShareType, si, si.Path);

        // If this is a file-system share, try to

        // list the first five subfolders.

        // NB: If the share is on a removable device,

        // you could get "Not ready" or "Access denied"

        // exceptions.

        if (si.IsFileSystem) 
        {
            try 
            {
                System.IO.DirectoryInfo d = si.Root;
                System.IO.DirectoryInfo[] Flds = d.GetDirectories();
                for (int i=0; i < Flds.Length && i < 5; i++)
                    Console.WriteLine("\t{0} - {1}", i, Flds[i].FullName);

                Console.WriteLine();
            }
            catch (Exception ex) 
            {
                Console.WriteLine("\tError listing {0}:\n\t{1}\n", 
                    si, ex.Message);
            }
        }
    }
}
else
    Console.WriteLine("Unable to enumerate the local shares.");

//

// Resolve local paths to UNC paths.

//

Console.WriteLine("{0} = {1}", 
    fileName, ShareCollection.PathToUnc(fileName));
于 2012-01-18T22:38:03.890 に答える