Страница: 1 |
Страница: 1 |
Вопрос: Как отследить события файловой системы?
Добавлено: 25.05.06 16:06
Автор вопроса: dr.Faust
Скажем, имеем такой код:
fsw = New FileSystemWatcher
fsw.Path = "C:\"
fsw.IncludeSubdirectories = True
fsw.NotifyFilter = IO.NotifyFilters.FileName
fsw.Filter = "*.*"
fsw.EnableRaisingEvents = True
AddHandler fsw.Deleted, AddressOf eventdel
Отслеживает удаление файла на диске С, а как отследить тоже событие на всех дисках? Создовать несколько экземпляров FileSystemWatcher? А если количество и имена дисков за ранние не известно?
Я конечно смогу получить список дисков, но че дальше?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 26.05.06 06:13
А дальше по экземпляру на каждый диск.
Сам же ответил на свой вопрос.
Номер ответа: 2
Автор ответа:
dr.Faust
Вопросов: 6
Ответов: 26
Профиль | | #2
Добавлено: 26.05.06 08:49
А как?
Вот так:
Dim diski() As String
Dim i As Int16
diski = Directory.GetLogicalDrives
For i = 0 To diski.GetUpperBound(0)
fsw(i) = New FileSystemWatcher
fsw(i).IncludeSubdirectories = True
fsw(i).NotifyFilter = IO.NotifyFilters.FileName
fsw(i).Filter = "*.*"
fsw(i).Path = diski(i)
fsw(i).EnableRaisingEvents = True
AddHandler fsw(i).Deleted, AddressOf eventdel
Next
Не получаеться.
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 26.05.06 22:37
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Drives() As DriveInfo = DriveInfo.GetDrives
For Each Drive As DriveInfo In Drives
'Add all HDD drives
If Drive.DriveType = DriveType.Fixed AndAlso Drive.IsReady Then
Dim fileWatcher As New FileSystemWatcher(Drive.Name)
With fileWatcher
.IncludeSubdirectories = True
.NotifyFilter = NotifyFilters.FileName
.Filter = "*.*"
.EnableRaisingEvents = True
End With
AddHandler fileWatcher.Deleted, AddressOf FileDeleted
End If
Next
End Sub
Private Sub FileDeleted(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs)
MessageBox.Show("File '" & e.FullPath & "' was deleted", "FileSystemWatcher", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
End Class
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 26.05.06 22:45
Можно,конечно, и через GetLogicalDrives но в этом случае придется писать дополнительный код,чтоб проверить, готово ли устройство и к какому типу оно принадлеждит (HDD,CD-ROM,Network и т.д..) Иначе, без этих проверок, повесишь слежку и на сетевые диски и на неготовые устройства... также лишние усилия на обработку ошибок..
Номер ответа: 5
Автор ответа:
dr.Faust
Вопросов: 6
Ответов: 26
Профиль | | #5
Добавлено: 27.05.06 10:10
Для 2003 не подходит?
Как в ней решить?
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 27.05.06 11:39
хм.. ты прав..
Тогда вместо DriveInfo.GetDrives используй GetLogicalDrives, но внутри цикла придется создавать экземляр DriveInfo,чтобы ты мог проверить что это за диск и готово ли устройство.
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 27.05.06 11:45
и все таки.. 2003 студия.. реально недоработана. Уже который раз натыкаюсь на существенные недостатки.. (((
Номер ответа: 8
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #8
Добавлено: 27.05.06 13:06
Гы гы.
Когда будет готов к выходу FW 3.0 в рамках следующей студии, то же самое будут говорить о 2.0.
И так будет ВСЕГДА, ибо именно так гарантируются продажи следующей версии.
Гы гы гы
Номер ответа: 9
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #9
Добавлено: 27.05.06 15:01
Посадили на понты человека...
Если надо выделить для нотификации логические диски винта, то делается так:
Dim lngRet As Long
Dim arr
lngRet = GetLogicalDriveStrings(256, strDrives)
strDrives = Left$(strDrives, lngRet)
arr = Split(strDrives, vbNullChar)
For i = 0 To UBound(arr)
If GetDriveType(ByVal arr(i)) = DRIVE_FIXED Then
Debug.Print arr(i)
'тут диск ставится на нотификацию
End If
Next
Номер ответа: 10
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #10
Добавлено: 27.05.06 23:20
For Each strDrive As String In Drives
Dim Drive As New DriveInfo(strDrive)
If Drive.DriveType = DriveType.Fixed AndAlso Drive.IsReady Then
With New FileSystemWatcher(Drive.Name, "*.*"
.IncludeSubdirectories = True
.NotifyFilter = NotifyFilters.FileName
.EnableRaisingEvents = True
AddHandler .Deleted, AddressOf FileDeleted
End With
End If
Next