none
IDEA PARA CONTROLAR EJECUCION EN SEGUNDO PLANO RRS feed

  • Pregunta

  • Hola,

    estoy pensando mucho en cómo tratar la siguiente situación en mi programa: quiero mostrar un mensaje cuando un fichero se abre. Para hacer esta tarea lo que he implementado es una ejecución en segundo plano, ya que en el directorio donde deseo obtener esta informacion puede abrirse un fichero en cualquier momento (no cuando ocurra algún evento específico). Para ello he realizado lo siguiente (resumo):

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _
        ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            While (btnStart.Enabled = False)
                For Each foundFile As String In My.Computer.FileSystem.GetFiles(txtCarpeta.Text)
                    If (IsFileOpen(foundFile)) Then
                        MessageBox.Show(foundFile)
                    End If
                Next
            End While
        End Sub

    Funciona muy bien pero seguro que véis el problema: el MessageBox(foundfile), cuando hay un fichero abierto, no deje de ejecutarse, todo el tiempo con la ventana del mensaje abierta hasta que cierro el fichero en cuestión.

    Lo que quiero hacer y no sé cómo es que ese MessageBox se ejecute SÓLO 1 VEZ y no moleste más. Si se abre otro fichero lo mismo, y si cierro el primero y vuelvo a abrirlo, pues un mensaje nuevo, pero SÓLO 1 VEZ, no infinitamente hasta que cierre el fichero.

    Agradezco de antemano cualquier aporte o alternativa a conocer si un fichero en un directorio conocido, se ha abierto.

    PD: nunca se pasa el fichero en cuestión, de ahí que esté siempre (en segundo plano) leyendo el directorio conocido por si alguno de sus ficheros se ha abierto.

    sábado, 1 de febrero de 2014 10:34

Respuestas

  • Hola, 

    Aquí tienes un ejemplo de como controlar si ya se mostró el mensaje para el fichero abierto.

    Para controlarlos usamos una lista.

        Dim listaOpenedFiles As New List(Of String)
    
        Private Function IsFileOpen(ByVal file As String) As Boolean
    
            Dim accesible As Boolean = False
    
            Try
    
                Dim stream As IO.FileStream = IO.File.Open(file, IO.FileMode.Open, IO.FileAccess.Write, IO.FileShare.None)
                stream.Close()
                stream.Dispose()
                stream = Nothing
    
                'Verificamos si el fichero que ahora se puede acceder estuvo bloqueado 
                'si existe en la lista lo eliminamos de la lista de ficheros abiertos 
    
                If listaOpenedFiles.Contains(file) = True Then
                    listaOpenedFiles.Remove(file)
                End If
    
            Catch ex As Exception
    
                'Verificamos si el fichero que está bloqueado ya está en la lista de ficheros abiertos, 
                'sino lo está lo añadimos a la lista de ficheros abiertos 
    
                If listaOpenedFiles.Contains(file) = False Then
    
                    listaOpenedFiles.Add(file)
    
                    accesible = True
    
                End If
    
            End Try
    
            Return accesible
    
        End Function
    


    Si te sirvió marca la respuesta como respuesta propuesta ;) 

    • Marcado como respuesta luis_vlc sábado, 1 de febrero de 2014 15:28
    sábado, 1 de febrero de 2014 12:46

Todas las respuestas

  • Hola, 

    Aquí tienes un ejemplo de como controlar si ya se mostró el mensaje para el fichero abierto.

    Para controlarlos usamos una lista.

        Dim listaOpenedFiles As New List(Of String)
    
        Private Function IsFileOpen(ByVal file As String) As Boolean
    
            Dim accesible As Boolean = False
    
            Try
    
                Dim stream As IO.FileStream = IO.File.Open(file, IO.FileMode.Open, IO.FileAccess.Write, IO.FileShare.None)
                stream.Close()
                stream.Dispose()
                stream = Nothing
    
                'Verificamos si el fichero que ahora se puede acceder estuvo bloqueado 
                'si existe en la lista lo eliminamos de la lista de ficheros abiertos 
    
                If listaOpenedFiles.Contains(file) = True Then
                    listaOpenedFiles.Remove(file)
                End If
    
            Catch ex As Exception
    
                'Verificamos si el fichero que está bloqueado ya está en la lista de ficheros abiertos, 
                'sino lo está lo añadimos a la lista de ficheros abiertos 
    
                If listaOpenedFiles.Contains(file) = False Then
    
                    listaOpenedFiles.Add(file)
    
                    accesible = True
    
                End If
    
            End Try
    
            Return accesible
    
        End Function
    


    Si te sirvió marca la respuesta como respuesta propuesta ;) 

    • Marcado como respuesta luis_vlc sábado, 1 de febrero de 2014 15:28
    sábado, 1 de febrero de 2014 12:46
  • Perfecto,

    muchas gracias!!!!

    Dim listaOpenedFiles As New List(Of String)

    como variable "global" y funciona perfecto.

    sábado, 1 de febrero de 2014 15:28