0

C# で切断されたドライブを列挙する問題を解決するこの優れた記事に出くわしました: マップされたネットワーク ドライブは C# で一覧表示できません

問題は、このコードには NTFS フォーマットのドライブ (FAT のみ) が含まれないように見えることです。

私は C++/WinAPI の専門家ではないので、コードを修正するのは難しいと思います (できれば)。誰かがすでにそれを調べて解決した可能性はありますか、少なくともヒントを教えてください。

ありがとう!ブシ

4

2 に答える 2

2

わかりました、答えがあります。NTFS や FAT とは関係ありません。

これは、ドライブを列挙するために使用したコードです。

WNetOpenEnum( RESOURCE_SCOPE.RESOURCE_REMEMBERED, RESOURCE_TYPE.RESOURCETYPE_DISK, 0, リソース, out ptrHandle);

最初のパラメータ RESOURCE_SCOPE.RESOURCE_REMEMBERED に注意してください。つまり、このメソッドは、PERSISTED (ログオン時に再接続することを意味します) として設定されたマップされたドライブのみを列挙します。

たとえば、パラメーターを RESOURCE_SCOPE.RESOURCE_CONNECTED に変更すると、永続化されていないドライブが接続されている場合は列挙されます。

すべての組み合わせが必要な場合は、次のようにします。

ありがとうございました!

于 2012-12-07T00:06:00.803 に答える
1

ローカルのNTFSドライブを一覧表示したい場合、あなたが言及した記事はそれをカットしません。それが使用するWin32関数は、ネットワークリソースを列挙することを目的としています。

したがって、すべてのローカルドライブとネットワークドライブを一覧表示する場合は、リンクのコードを使用する必要があります。また、System.IO名前空間からDriveInfo.GetDrives()(またはEnvironment.GetDrives())を呼び出す必要があります。

ただし、GetDrives()は接続されたネットワークドライブも返すため、重複を避けるために両方のリストの結果をマージする必要があります。

    static void Main(string[] args)
    {
        List<string> drives = new List<string>();
        // Assuming you put the API calls in Class1
        foreach (var item in Class1.WNetResource())
        {
            // WNetResource returns the drive letters without a trailing slash
            drives.Add(String.Concat(item.Key, @"\"));
        }

        foreach (var item in Environment.GetLogicalDrives())
        {
            if (!drives.Contains(item))
                drives.Add(item);
        }

        drives.Sort();

        foreach (var drive in drives)
        {
            Console.WriteLine(drive);
        }
    }

お役に立てば幸いです。

于 2012-12-06T16:36:16.940 に答える