2

伙计们,

多年来,我一直很高兴地使用下面的 C# IsNetworkDrive方法来确定“这是网络驱动器吗?” 在 Windows XP 下。它仍然会在 Windows 7 下产生预期的结果,但每次调用需要大约 10 秒的时间......所以大约一百万倍太长了!

using System;
using System.Collections.Generic;
using System.Management;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var driveName in Environment.GetLogicalDrives())
                Console.WriteLine(driveName + " " + IsNetworkDrive(driveName.Substring(0,2)));
            Console.Write("Press any key to continue ...");
            Console.ReadKey();
        }

        private static bool IsNetworkDrive(string drive)
        {
            var query = @"SELECT Name FROM win32_NetworkConnection WHERE LocalName='" + drive + "'";
            var seacher = new ManagementObjectSearcher(query);
            var resultset = seacher.Get();
            var count = resultset.Count;
            return count == 1;
        }

    }
}

啊啊啊啊。我讨厌Windows!

请问有人知道如何 [performantly] 确定给定的驱动器号是在 Windows 7 和 Windows XP(企业 SOE)上代表本地驱动器还是网络驱动器????

[最好在 .NET <= 3.5 中,虽然我可以将项目升级到 4.0,但它只需要一个绿地测试,我们现在没有钱。叹。]

祝大家欢呼。基思。

4

1 回答 1

1

我在回答我自己的问题。

更多的谷歌搜索将我带到这篇文章:如何以编程方式发现系统上映射的网络驱动器及其服务器名称?

该问题中的代码将我引向:DriveInfo.GetDrives()我在我的主要方法中工作:

    static void Main(string[] args) {
        foreach (var driveInfo in DriveInfo.GetDrives())
            Console.WriteLine(driveInfo + " " + driveInfo.DriveType);
        Console.Write("Press any key to continue ...");
        Console.ReadKey();
    }

生产:

C:\ Fixed
D:\ CDRom
E:\ Removable
G:\ Network
H:\ Network
I:\ Network
K:\ Network
L:\ Network
M:\ Network
Q:\ Network
Press any key to continue ...

...然后离那里不远:

    // Example drives: "C:" or "L:" ... just the drive-letter and a colon. No backslash. 
    private static bool IsNetworkDrive(string drive) {
        return new DriveInfo(drive).DriveType == DriveType.Network;
    }

这会在 Windows 7 下以非管理员身份运行,在预期的 [亚秒级] 时间范围内产生预期的结果。

希望这可以帮助其他人。

祝大家欢呼。基思。

于 2012-05-14T01:09:50.233 回答