наличие Win32_MountPoint и Win32_Volume в Windows XP? - PullRequest
3 голосов
/ 12 мая 2010

Из найденных статей MSDN - http://msdn.microsoft.com/en-us/library/aa394515(v=VS.85).aspx - Win32_Volume и Win32_MountPoint недоступны в Windows XP.

Тем не менее, я занимаюсь разработкой приложения на C # для Windows XP (64-битная версия), и я могу нормально добраться до этих классов WMI. Пользователи моего приложения будут работать на Windows XP sp2 с .Net 3.5 sp1.

Погуглив, я не могу определить, могу ли я рассчитывать на это или нет. Я успешен в моей системе из-за одного или нескольких из следующих: Windows XP Service Pack 2? - Visual Studio 2008 SP1 была установлена? - .Net 3.5 sp1?

Должен ли я использовать что-то кроме WMI для получения информации о томе / точке монтирования?

Ниже приведен пример кода, который работает ...

    public static Dictionary<string, NameValueCollection> GetAllVolumeDeviceIDs()
    {
        Dictionary<string, NameValueCollection> ret = new Dictionary<string, NameValueCollection>();

        // retrieve information from Win32_Volume
        try
        {
            using (ManagementClass volClass = new ManagementClass("Win32_Volume"))
            {
                using (ManagementObjectCollection mocVols = volClass.GetInstances())
                {
                    // iterate over every volume
                    foreach (ManagementObject moVol in mocVols)
                    {
                        // get the volume's device ID (will be key into our dictionary)                            
                        string devId = moVol.GetPropertyValue("DeviceID").ToString();

                        ret.Add(devId,  new NameValueCollection());

                        //Console.WriteLine("Vol: {0}", devId);

                        // for each non-null property on the Volume, add it to our NameValueCollection
                        foreach (PropertyData p in moVol.Properties)
                        {
                            if (p.Value == null)
                                continue;
                            ret[devId].Add(p.Name, p.Value.ToString());
                            //Console.WriteLine("\t{0}: {1}", p.Name, p.Value);
                        }

                        // find the mountpoints of this volume
                        using (ManagementObjectCollection mocMPs = moVol.GetRelationships("Win32_MountPoint"))
                        {
                            foreach (ManagementObject moMP in mocMPs)
                            {
                                // only care about adding directory
                                // Directory prop will be something like "Win32_Directory.Name=\"C:\\\\\""
                                string dir = moMP["Directory"].ToString();

                                // find opening/closing quotes in order to get the substring we want
                                int first = dir.IndexOf('"') + 1;
                                int last = dir.LastIndexOf('"');
                                string dirSubstr = dir.Substring(first , last - first);

                                // use GetFullPath to normalize/unescape any extra backslashes
                                string fullpath = Path.GetFullPath(dirSubstr);

                                ret[devId].Add(MOUNTPOINT_DIRS_KEY, fullpath);

                            }
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Problem retrieving Volume information from WMI. {0} - \n{1}",ex.Message,ex.StackTrace);
            return ret;
        }

        return ret;

    }

Ответы [ 2 ]

1 голос
/ 12 мая 2010

Полагаю, классы Win32_MountPoint и Win32_Volume доступны в Windows XP Professional x64 Edition, поскольку они основаны на базе кода Windows Server 2003 .В 32-разрядных версиях Windows XP эти классы не существуют, и для выполнения вашей задачи вам нужно P / Invoke встроенные функции управления томами, как сказал Тим.

1 голос
/ 12 мая 2010

Возможно, вам понадобится ввести в Функции управления томами Win32

...