Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Как отследить события файловой системы? Добавлено: 25.05.06 16:06  

Автор вопроса:  dr.Faust
Скажем, имеем такой код:
Dim fsw As FileSystemWatcher
        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 fsw() As FileSystemWatcher
        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
Imports System.IO

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
хм.. ты прав..
Note: This method is new in the .NET Framework version 2.0.

Тогда вместо 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
и все таки.. 2003 студия.. реально недоработана. Уже который раз натыкаюсь на существенные недостатки.. (((

Гы гы.

Когда будет готов к выходу FW 3.0 в рамках следующей студии, то же самое будут говорить о 2.0.
И так будет ВСЕГДА, ибо именно так гарантируются продажи следующей версии.

Гы гы гы

Ответить

Номер ответа: 9
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #9 Добавлено: 27.05.06 15:01
Посадили на понты человека...

Если надо выделить для нотификации логические диски винта, то делается так:

    Dim strDrives As String * 256
    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
        Dim Drives() As String = Directory.GetLogicalDrives

        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



Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам