簡體   English   中英

枚舉斷開的網絡驅動器-NTFS驅動器格式

[英]Enumerating disconnected network drives - NTFS drive formats

我碰到了一篇出色的文章,解決了枚舉C#中斷開連接的驅動器的問題: 映射的網絡驅動器無法在C#中列出

問題是似乎此代碼將不包括NTFS格式的驅動器(僅FAT)

由於我不是C ++ / WinAPI技術人員,因此發現很難修復代碼(如果可能的話)。 有沒有人已經研究並解決了它,或者至少給了我一個提示?

謝謝! 布西

好,我有一個答案。 它與NTFS和FAT無關。

這是我用來枚舉驅動器的代碼:

WNetOpenEnum(RESOURCE_SCOPE.RESOURCE_REMEMBERED,RESOURCE_TYPE.RESOURCETYPE_DISK,0,資源,出自ptrHandle);

請注意第一個參數RESOURCE_SCOPE.RESOURCE_REMEMBERED。 這意味着該方法將僅枚舉那些設置為PERSISTED的映射驅動器(這意味着在登錄時重新連接)。

例如,如果我將參數更改為RESOURCE_SCOPE.RESOURCE_CONNECTED,則將枚舉非持久驅動器(如果已連接)。

如果需要所有組合,則可以執行以下操作:WNetOpenEnum(RESOURCE_SCOPE.RESOURCE_REMEMBERED | RESOURCE_SCOPE.RESOURCE_RECENT | RESOURCE_SCOPE.RESOURCE_CONNECTED,RESOURCE_TYPE.RESOURCETYPE_DISK,0,資源,出自ptrHandle);

謝謝!

如果要列出本地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);
        }
    }

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM