Определить диск на котором установлена система

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Определить диск на котором установлена система

Сообщение edyapd » 17.10.2011 (Пн) 9:32

Пользуюсь такой командой: Environ("windir")
У меня на компьютере отрабатывает нормально и выдает: C:\Windows
У товарища программа виснет на этой команде.
Может можно как то по другому определить, на каком диске установлена система?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Определить диск на котором установлена система

Сообщение Admiralisimys » 17.10.2011 (Пн) 13:51

edyapd как вариант можно получить путь System32
System.Environment.SystemDirectory
А после по строке подняться на уровень выше.

Или воспользоваться Win32 UnManaged вариантом
Код: Выделить всё
'Где-то в объявлении класса
Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As UInteger) As UInteger
'Где в методе класса
Dim sWindows As New String("", 260)
GetWindowsDirectory(sWindows, 260)
Console.WriteLine(sWindows)


P.S.
В теме речь про системную директорию, а в заголовке про системный диск. Отвечал на первый пост.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.10.2011 (Пн) 14:09

Admiralisimys писал(а):В теме речь про системную директорию, а в заголовке про системный диск. Отвечал на первый пост.

Системный диск легко получается из системной директории :)

Admiralisimys писал(а):Или воспользоваться Win32 UnManaged вариантом

Тогда уж юникодным. Если не ошибаюсь:
Код: Выделить всё
Declare Unicode Function ... Alias "GetWindowsDirectoryW" ...

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Определить диск на котором установлена система

Сообщение Admiralisimys » 17.10.2011 (Пн) 14:24

Qwertiy сейчас это верно, но в будущем, возможно, как с System32 так и системный диском, может случиться разнесение, по аналогии с Юниксами. :lol: Так что прямой получения (если такой существует) будет всегда лучше. 8)

Юникод объявление можно получить всего лишь поменяв в Alias в конце функции на W. Про Declare Unicode честно говоря некогда не слышал. Но если поступить, как знаю я, будет неудобство заключающие в том, что Win32 функция рассматривает sWindows как массив на 260 байт, и при переходе на Юникод потребуется уже указывать как 2х260, при этом Юникод вывод будет в виде (к примеру)
C : \ W i n d o w s
вместо C:\Windows
Так что как раз возможно и в отсутствии Declare Unicode Function будет дело.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.10.2011 (Пн) 14:45

Admiralisimys писал(а):... будет неудобство заключающие в том ...

В VB.NET, в отличие от VB6, есть возможность явного указания Unicode или ANSI в Declare. В качестве аргумента по-прежнему передаётся String, а не массив байтов. Никакого ручного преобразования не требуется.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.10.2011 (Пн) 14:59

Declare Unicode Function.png
Вот :)

Код: Выделить всё
Module All
  Declare Unicode Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryW" (ByVal lpBuffer As String, ByVal nSize As UInteger) As UInteger

  Public Sub Main()
    Dim Path As New String(" "c, GetWindowsDirectory(Nothing, 0))
    GetWindowsDirectory(Path, Path.Length)
    MsgBox(Path)
  End Sub
End Module

А вообще, странно, что в My.Computer.FileSystem.SpecialDirectories нет. Пожалуй, правильнее использовать System.Environment.
Последний раз редактировалось Qwertiy 17.10.2011 (Пн) 15:05, всего редактировалось 1 раз.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Определить диск на котором установлена система

Сообщение Admiralisimys » 17.10.2011 (Пн) 15:04

Qwertiy спасибо. Это действительно работает, никаких пробелов не замечено.

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Определить диск на котором установлена система

Сообщение edyapd » 17.10.2011 (Пн) 16:53

Нашел в интернете:
Код: Выделить всё
    Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
    Function GetWinDir() As String
        Dim szBuffer As String = "                                                   "
        Dim lngRet As Long
        lngRet = GetWindowsDirectory(szBuffer, 50)
        GetWinDir = Left$(szBuffer, lngRet)
    End Function

Что практически тоже самое, что предлагалось Admiralisimys
Данный метод работает.
Но из ваших рассуждений понял, что это не самый правильный путь.
Напишите кто-нибудь однозначный ответ, как будет правильно.

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Определить диск на котором установлена система

Сообщение edyapd » 17.10.2011 (Пн) 16:55

Admiralisimys писал(а):В теме речь про системную директорию, а в заголовке про системный диск. Отвечал на первый пост.

Просто я не нашел способа сразу получить системный диск. И по этому потом отрезаю лишнее и получаю "С:"

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Определить диск на котором установлена система

Сообщение Admiralisimys » 17.10.2011 (Пн) 17:06

Environment.GetEnvironmentVariable("SystemDrive")

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Определить диск на котором установлена система

Сообщение edyapd » 17.10.2011 (Пн) 19:21

Admiralisimys писал(а):Environment.GetEnvironmentVariable("SystemDrive")

Понял. Спасибо.
Буду пробовать


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

    TopList