none
process start time RRS feed

  • Pregunta

  • Buenas tardes a todos.

    Cómo se podría saber el tiempo de inicio de apertura de un archivo, como por ejemplo un archivo de Excel?

    ya se que dependiendo del proceso, este dato lo obtenemos de StartTime de la clase Process; sin embargo si abro 2 o mas archivos de Excel en momentos distintos, entendemos que cada uno tiene diferente tiempo de apertura  (por lo menos en segundos), sin embargo con el StartTime me da el tiempo exacto del proceso de Excel con el primer archivo.... ¿Cómo se puede obtener el tiempo de apertura exacto de los archivos subsecuentes de Excel?

    En espera a sus comentarios, agradezco su ayuda.

    saludos.

    viernes, 16 de junio de 2017 22:29

Respuestas

  • Primero una observación: cuando dices que la apertura del primer archivo si que la puedes conocer mirando cuándo se inició Excel... esto solo es cierto si abrieron Excel haciendo click en el archivo. Pero si primero abren Excel, y luego usan "Archivo -> abrir" para abrir un archivo, no te coincidirán los tiempos.

    Desde C# puedes usar la clase FileInfo para leer del archivo la fecha de creación, fecha de la última escritura, y fecha de la última lectura. Pero ninguna de las tres es la "fecha de apertura"; me temo que este dato no se conserva con el archivo.

    Si no te basta con la fecha de acceso, y necesariamente requieres ma de apertura, lo único que se me ocurre es poner en marcha un proceso que monitorice todas las aperturas de ficheros, las vaya memorizando, y luego lo interrogues para consultar el fichero que deseas. Esta "monitorización" la podrías hacer con ETW (Event Tracing for Windows), pero prepárate para hacer un esfuerzo considerable porque es una API sumamente compleja.

    Otra cosa que podrías probar es a usar la clase FileSystemWatcher (en System.IO). Aunque en teoría solo monitoriza los cambios, y no las aperturas de ficheros, si tenemos la suerte de que Excel cambie siempre algo del fichero en el momento de abrirlo, entonces con los eventos del FileSystemWatcher sí que podrías detectar todas las aperturas de estos ficheros. Si esto funciona, es MUCHO más sencillo que ETW, así que merece la pena probarlo.

    sábado, 17 de junio de 2017 7:14
    Moderador

Todas las respuestas

  • Primero una observación: cuando dices que la apertura del primer archivo si que la puedes conocer mirando cuándo se inició Excel... esto solo es cierto si abrieron Excel haciendo click en el archivo. Pero si primero abren Excel, y luego usan "Archivo -> abrir" para abrir un archivo, no te coincidirán los tiempos.

    Desde C# puedes usar la clase FileInfo para leer del archivo la fecha de creación, fecha de la última escritura, y fecha de la última lectura. Pero ninguna de las tres es la "fecha de apertura"; me temo que este dato no se conserva con el archivo.

    Si no te basta con la fecha de acceso, y necesariamente requieres ma de apertura, lo único que se me ocurre es poner en marcha un proceso que monitorice todas las aperturas de ficheros, las vaya memorizando, y luego lo interrogues para consultar el fichero que deseas. Esta "monitorización" la podrías hacer con ETW (Event Tracing for Windows), pero prepárate para hacer un esfuerzo considerable porque es una API sumamente compleja.

    Otra cosa que podrías probar es a usar la clase FileSystemWatcher (en System.IO). Aunque en teoría solo monitoriza los cambios, y no las aperturas de ficheros, si tenemos la suerte de que Excel cambie siempre algo del fichero en el momento de abrirlo, entonces con los eventos del FileSystemWatcher sí que podrías detectar todas las aperturas de estos ficheros. Si esto funciona, es MUCHO más sencillo que ETW, así que merece la pena probarlo.

    sábado, 17 de junio de 2017 7:14
    Moderador
  • ok, muchas gracias... lo voy a checar y te comento los resultados.

    saludos

    martes, 20 de junio de 2017 17:04
  • buenas tardes... como pregunta adicional al tema (perdona mi ignorancia)

    si estoy ocupando como por ejemplo lo siguiente:

            Process[] procesos = Process.GetProcesses();

            foreach (Process proceso in procesos)
            {
                    Process[] processes = Process.GetProcessesByName(proceso.ProcessName);

                    //- instrucciones para obtener datos

           }

    Con esto cacho los datos como el nombre del proceso incluso el nombre de la ventana activa, también cuanto tiempo esta abierto, entre otras cosas.

    Sin embargo... como por ejemplo, si el usuario abre desde una misma hoja de Excel 2 o más archivos, solo quedará como proceso activo el último abierto y los primeros quedan en segundo plano; ¿cómo hago para saber que archivos de Excel están abiertos? (saber cuantos y cuales archivos de Excel están en segundo plano).

    intente por id de proceso pero es el mismo ya que es un proceso y no un archivo abierto, necesito ver todo en segundo y primer plano, además de saber si uno de ellos ya esta cerrado; el comando HasExited de igual manera es por proceso y no por archivo.

    Espero haberme explicado bien.

    Saludos y gracias por el apoyo

    lunes, 10 de julio de 2017 20:29