Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
5 / 5 / 1
Регистрация: 27.07.2013
Сообщений: 64

Проверить, вставлен ли флеш-накопитель

28.11.2013, 14:39. Показов 1832. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помгите пожалуйста.Как сделать.Если флешка вставлена и пусть она будет F: то надо проверить на существование этого диска и если есть вывести сообщение что найдено а если нет то сообщение не найдено
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2013, 14:39
Ответы с готовыми решениями:

Не определяется флеш накопитель
Доброго времени суток! Проблема моя в следующем: Имееется флешка OCZ ATV 8Gb (OCZUSBATV8G) . Была куплена прошлым летом....

Флеш накопитель с ключом
Доброго времени суток форумчане. Возник вопрос любопытный. Имеется флешка 16 Gb с ПО. Для его работы требуется ключ, который зашит на этом...

IntelliJ IDEA и флеш накопитель
Доброго времени суток. Сразу скажу, что я вобще не в теме, но очень хочется) Собственно вопрос в следующем: На работе стоят МАКи (дома...

4
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
28.11.2013, 14:50
http://www.pinvoke.net/default... tdrivetype
1
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.11.2013, 15:48
Лучший ответ Сообщение было отмечено как решение

Решение

Как вариант
VB.NET
1
2
3
4
5
        For Each Drv As IO.DriveInfo In IO.DriveInfo.GetDrives
            If Drv.DriveType = IO.DriveType.Removable And Drv.IsReady Then 'Отбираем только съемные диски и те, которые доступны
                MsgBox("Имя диска: " & Drv.Name & ". Метка тома (если есть): " & Drv.VolumeLabel & ". Тип файловой системы: " & Drv.DriveFormat)
            End If
        Next
5
5 / 5 / 1
Регистрация: 27.07.2013
Сообщений: 64
28.11.2013, 16:41  [ТС]
хороший вариант
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
29.11.2013, 19:59
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вставленные флешки добавляются в список автоматом, когда система их увидит.
Ну и кнопкой можно извлечь выбранную.
На форму надо поместить ListBox (ListBox1) и Button (btnEject)
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
Imports System.IO 
Imports System.Runtime.InteropServices 
Imports System.Threading 
 
Public Class Form_DetectRemovableDrive 
 
    ' отлавливание событий монтирования/размонтирования флешки, составления списка флешек 
 
    Const WM_DEVICECHANGE = &H219 
 
    Private Enum DeviceEvents 
        ConfigChangeCanceled = &H19 'A request to change the current configuration (dock or undock) has been canceled. 
        ConfigChanged = &H18 'The current configuration has changed, due to a dock or undock. 
        CustomEevent = &H8006 'A custom event has occurred. 
        DeviceArrival = &H8000 'A device or piece of media has been inserted and is now available. 
        DeviceQueryRemove = &H8001 'Permission is requested to remove a device or piece of media. Any application can deny this request and cancel the removal. 
        DeviceQueryRemoveFailed = &H8002 'A request to remove a device or piece of media has been canceled. 
        DeviceRemoveComplete = &H8004 'A device or piece of media has been removed. 
        DeviceRemovePending = &H8003 'A device or piece of media is about to be removed. Cannot be denied. 
        DeviceTypeSpecific = &H8005 'A device-specific event has occurred. 
        DeviceNodesChanged = &H7 'A device has been added to or removed from the system. 
        QueryChangeConfig = &H17 'Permission is requested to change the current configuration (dock or undock). 
        UserDefined = &HFFFF 
    End Enum 
 
    Private Enum DeviceTypes As UInteger 
        DeviceInterface = &H5 'Class of devices. This structure is a DEV_BROADCAST_DEVICEINTERFACE structure. 
        Handle = &H6 'File system handle. This structure is a DEV_BROADCAST_HANDLE structure. 
        OEM = &H0 'OEM- or IHV-defined device type. This structure is a DEV_BROADCAST_OEM structure. 
        Port = &H3 'Port device (serial or parallel). This structure is a DEV_BROADCAST_PORT structure. 
        Volume = &H2 'Logical volume. This structure is a DEV_BROADCAST_VOLUME structure. 
    End Enum 
 
    Private Enum DeviceFlags As UShort 
        Media = &H1 'Change affects media in drive. If not set, change affects physical device or drive. 
        Net = &H2 'Indicated logical volume is a network volume. 
    End Enum 
 
    Private Structure DeviceBroadcastHeader 
        Public Size As UInteger 
        Public DeviceType As DeviceTypes 
        Public Reserved As UInteger 
    End Structure 
 
    Private Structure DeviceBroadcastVolume 
        Public Size As UInteger 
        Public DeviceType As DeviceTypes 
        Public Reserved As UInteger 
        Public UnitMask As UInteger 
        Public Flags As DeviceFlags 
    End Structure 
 
    Private Function GetDriveLetter(ByVal UnitMask As UInteger) As Char 
        If UnitMask > 0 Then 
            Dim i As Integer = 0 
            Do While (i < 26) And ((UnitMask And 1) = 0) 
                UnitMask >>= 1 
                i += 1 
            Loop 
            GetDriveLetter = Chr(Asc("A") + i) 
        Else 
            GetDriveLetter = vbNullChar 
        End If 
    End Function 
 
    Protected Overrides Sub WndProc(ByRef m As Message) 
        Select Case m.Msg 
            Case WM_DEVICECHANGE : RaiseEvent OnDeviceChange(m) 
        End Select 
        MyBase.WndProc(m) 
    End Sub 
 
    Public Event OnDeviceChange(ByRef m As Message) 
 
    Private Sub Form_OnDeviceChange(ByRef m As Message) Handles Me.OnDeviceChange 
        Dim h As DeviceBroadcastHeader = m.GetLParam(GetType(DeviceBroadcastHeader)) 
        Select Case m.WParam 
            Case DeviceEvents.DeviceArrival 
                GetFlashes() 
            Case DeviceEvents.DeviceRemoveComplete 
                GetFlashes() 
        End Select 
    End Sub 
 
    Private Function GetDriveSize(ByVal butes As Object) As String 
        Dim retstr As String = "" 
        Dim ln As Long = butes.ToString.Length 
        If ln > 0 Then 
            Dim bsize As Long = CLng(butes) 
            If bsize < 1025 Then ' до килобайта 
                retstr = CStr(butes) & " Б" 
            End If 
            If bsize > 1024 And bsize < 1048577 Then ' до мегабайта 
                retstr = CStr(Math.Round(butes / 1024, 2)) & " КБ" 
            End If 
            If bsize > 1048576 And bsize < 1073741825 Then ' до гигабайта 
                retstr = CStr(Math.Round(butes / 1048576, 2)) & " МБ" 
            End If 
            If bsize > 1073741824 Then 'свыше гигабайта 
                retstr = CStr(Math.Round(butes / 1073741824, 2)) & " ГБ" 
            End If 
        Else 
            retstr = "" 
        End If 
        Return retstr 
    End Function 
 
    Private Sub GetFlashes() 
        Me.ListBox1.Items.Clear() 
        Dim DRV As IO.DriveInfo 
        Dim DRVCount As Integer = My.Computer.FileSystem.Drives.Count 
        For i = 0 To DRVCount - 1 
            DRV = My.Computer.FileSystem.Drives.Item(i) 
            If (DRV.IsReady = True) And (DRV.DriveType = IO.DriveType.Removable) Then 
                Me.ListBox1.Items.Add(DRV.Name & ", " & DRV.VolumeLabel & ", " & Me.GetDriveSize(DRV.TotalSize)) 
            End If 
        Next 
    End Sub 
 
    Private Sub Form_DetectRemovableDrive_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
        Me.Text = My.Application.Info.AssemblyName 
        GetFlashes() 
    End Sub 
 
    Private Sub btnEject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEject.Click 
        If Me.ListBox1.SelectedItems.Count = 0 Then 
            MsgBox("Выберите устройство в списке") 
            Exit Sub 
        End If 
        Dim drvname As String = Me.ListBox1.SelectedItem.ToString.Substring(0, 3) 
        Select Case DeviceEject(drvname) 
            Case Is = True 
                MsgBox("Устройство может быть извлечено") 
            Case Is = False 
                MsgBox("Устройство используется и не может быть извлечено") 
        End Select 
    End Sub 
 
    ' тут начинается таинство извлечения 
 
    Private Const LOCK_TIMEOUT As Integer = 10000       ' 10 секунд приостановки процесса 
    Private Const LOCK_RETRIES As Integer = 20 
    Private Const GENERIC_READ As Integer = &H80000000 
    Private Const GENERIC_WRITE As Integer = &H40000000 
    Private Const OPEN_EXISTING As Integer = 3 
    Private Const FILE_SHARE_READ As Integer = 1 
    Private Const FILE_SHARE_WRITE As Integer = 2 
    Private Const INVALID_HANDLE_VALUE As Integer = -1 
    Private Const FSCTL_LOCK_VOLUME As Integer = &H90018 
    Private Const FSCTL_DISMOUNT_VOLUME As Integer = &H90020 
    Private Const IOCTL_STORAGE_MEDIA_REMOVAL As Integer = &H2D4804 
    Private Const IOCTL_STORAGE_EJECT_MEDIA As Integer = &H2D4808 
    Private Const IOCTL_STORAGE_LOAD_MEDIA As Integer = &H2D480C 
 
    Private Structure PREVENT_MEDIA_REMOVAL 
        Dim PreventMediaRemoval As Boolean 
    End Structure 
 
    Private Declare Auto Function DeviceIoControl Lib "kernel32" (ByVal hDevice As IntPtr, ByVal dwIoControlCode As Integer, ByVal lpInBuffer As IntPtr, ByVal nInBufferSize As Integer, ByVal lpOutBuffer As IntPtr, ByVal nOutBufferSize As Integer, ByRef lpBytesReturned As Integer, ByVal lpOverlapped As IntPtr) As Boolean 
    Private Declare Unicode Function CreateFile Lib "kernel32" Alias "CreateFileW" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As IntPtr, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As IntPtr) As IntPtr 
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As IntPtr) As Boolean 
 
    Private Function OpenVolume(ByVal drive As DriveInfo) As IntPtr 
        Dim hVolume As IntPtr 
        Dim driveLetter As String = CChar(drive.Name) ' this will take only the first character 
        Dim dwAccessFlags As Integer 
        Select Case drive.DriveType 
            Case DriveType.Removable 
                dwAccessFlags = GENERIC_READ Or GENERIC_WRITE 
            Case DriveType.CDRom 
                dwAccessFlags = GENERIC_READ 
            Case Else 
                Throw New ArgumentException(String.Format("Cannot eject--'{0}' is not a removable drive.", drive.Name)) 
        End Select 
 
        hVolume = CreateFile(String.Format("\\.\{0}:", driveLetter), dwAccessFlags, FILE_SHARE_READ Or FILE_SHARE_WRITE, Nothing, OPEN_EXISTING, 0, Nothing) 
        If hVolume = INVALID_HANDLE_VALUE Then 
            Throw New IOException("Unable to open volume") 
        End If 
        Return hVolume 
    End Function 
 
    Private Function LockVolume(ByVal hVolume As IntPtr) As Boolean 
        Dim dwBytesReturned As UInteger 
        Dim dwSleepAmount As UInteger 
        dwSleepAmount = LOCK_TIMEOUT / LOCK_RETRIES 
        For nTryCount As Integer = 1 To LOCK_RETRIES 
            If (DeviceIoControl(hVolume, FSCTL_LOCK_VOLUME, Nothing, 0, Nothing, 0, dwBytesReturned, Nothing)) Then 
                Return True 
            End If 
            ' Thread.Sleep(dwSleepAmount) 
        Next 
        Return False 
    End Function 
 
    Private Function DismountVolume(ByVal hVolume As IntPtr) As Boolean 
        Dim dwBytesReturned As UInteger 
        Return DeviceIoControl(hVolume, FSCTL_DISMOUNT_VOLUME, Nothing, 0, Nothing, 0, dwBytesReturned, Nothing) 
    End Function 
 
    Private Function PreventRemovalOfVolume(ByVal hVolume As IntPtr, ByVal fPreventRemoval As Boolean) As Boolean 
        Dim dwBytesReturned As UInteger 
        Dim PMR As PREVENT_MEDIA_REMOVAL 
        Dim bufferSize As Integer = Marshal.SizeOf(GetType(PREVENT_MEDIA_REMOVAL)) 
        Dim succeeded As Boolean = False 
        Dim lpInBuffer As IntPtr = IntPtr.Zero 
        Try 
            lpInBuffer = Marshal.AllocCoTaskMem(bufferSize) 
            PMR.PreventMediaRemoval = fPreventRemoval 
            Marshal.StructureToPtr(PMR, lpInBuffer, False) 
            succeeded = DeviceIoControl(hVolume, IOCTL_STORAGE_MEDIA_REMOVAL, lpInBuffer, bufferSize, Nothing, 0, dwBytesReturned, Nothing) 
        Finally 
            If lpInBuffer <> IntPtr.Zero Then 
                Marshal.FreeCoTaskMem(lpInBuffer) 
            End If 
        End Try 
        Return succeeded 
    End Function 
 
    Private Function EjectMedia(ByVal hVolume As IntPtr) As Boolean 
        Dim dwBytesReturned As UInteger 
        Return DeviceIoControl(hVolume, IOCTL_STORAGE_EJECT_MEDIA, Nothing, 0, Nothing, 0, dwBytesReturned, Nothing) 
    End Function 
 
    Private Function LoadMedia(ByVal hVolume As IntPtr) As Boolean 
        Dim dwBytesReturned As UInteger 
        Return DeviceIoControl(hVolume, IOCTL_STORAGE_LOAD_MEDIA, Nothing, 0, Nothing, 0, dwBytesReturned, Nothing) 
    End Function 
 
    Public Function DeviceEject(ByVal driveName As String) As Boolean ' можно также открыть лоток оптического привода 
        Dim drive As New DriveInfo(driveName) 
        Dim hVolume As IntPtr 
        Dim dismountSucceeded As Boolean = False 
        Dim ejectSucceeded As Boolean = False 
        ' Open the volume. 
        hVolume = OpenVolume(drive) 
        ' Lock and dismount the volume. 
        If (LockVolume(hVolume) AndAlso DismountVolume(hVolume)) Then 
            ' Set prevent removal to false and eject the media. 
            If (PreventRemovalOfVolume(hVolume, False) AndAlso EjectMedia(hVolume)) Then 
                ejectSucceeded = True 
            End If 
        End If 
        ' Close the volume so other processes can use the drive. 
        If Not CloseHandle(hVolume) Then 
            ejectSucceeded = False 
        End If 
        Return ejectSucceeded 
    End Function 
 
    Public Function DeviceLoad(ByVal driveName As String) As Boolean ' можно также закрыть лоток оптического привода 
        Dim drive As New DriveInfo(driveName) 
        Dim hVolume As IntPtr 
        Dim loadSucceeded As Boolean = False 
        ' Open the volume. 
        hVolume = OpenVolume(drive) 
        ' Load the media. 
        If LoadMedia(hVolume) Then 
            loadSucceeded = True 
        End If 
        ' Close the volume so other processes can use the drive. 
        If Not CloseHandle(hVolume) Then 
            loadSucceeded = False 
        End If 
        Return loadSucceeded 
    End Function 
 
End Class

Все это дело можно разделить на 2 секции:
1) отлов событий монтирования/размонтирования флешек + составление списка флешек.
2) собственно набор функций для отключения флешки, выбранной из списка. В этом фрагменте мы фактически пользуем 2 функции:
DeviceEject - отключение флешки
DeviceLoad - в данном случае не используется. Вот почему: код, начиная со строки
' тут начинается таинство извлечения
довольно универсален и позволяет также открывать/закрывать лотки оптических приводов.
Приведенные выше 2 функции принимают как входящий параметр имя диска (например H:\) и на выходе рапортуют об успешности ( на выходе истина/ложь).
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.11.2013, 19:59
Помогаю со студенческими работами здесь

Не форматируется флеш накопитель MicroSDXC
Здравствуйте! Вчера решил вставить флешку в android устройство(первый раз, а так ранее флешка постоянно находилась в планшетном...

Программа, тестирующая флеш-накопитель
Здравствуйте, создан проект c cpp-файлом, который выводит информацию о флеш-накопителе. Работает в консоли, хотелось бы узнать, как...

Заблокировать запись на флеш накопитель
Не знаю в какой раздел лучше отнести данную тему. Состоит вопрос в чем. Нужно написать некую программу при помощи которой можно отслеживать...

Притормаживает Флеш Накопитель USB
Здравствуйте. У меня такая проблемка. Приобрел Silicon Power - Touch 850. При копировании любых файлов на эту флешку, происходят паузы...

Загрузочная флешка как флеш-накопитель
Возник вопрос. После того, как я сделаю флешку загрузочной, можно ли будет использовать ее как флеш-накопитель?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru