Cómo copiar un archivo mientras se escribe en C#

Actualmente estoy trabajando en el Servicio de Windows para copiar datos de nuestras cámaras de seguridad a medida que se escriben en el directorio de Google Drive en la computadora para cargarlos instantáneamente. Se puede acceder a los archivos inmediatamente después de la creación mediante el software de reproducción provisto, por lo que nos gustaría, si es posible, copiar inmediatamente el flujo de datos, de esa manera tenemos algo de video incluso si se interrumpe la grabación (los archivos son bloques de tiempo de 10 minutos).

Actualmente tengo un servicio creado que puede ver el directorio, sin embargo, tengo algunas dificultades para determinar la mejor manera de ver estos archivos. Dado que se modifican continuamente durante 10 minutos, recibiré una gran cantidad de eventos modificados. Esperaba que pudiera haber una manera de capturar la creación inicial y comenzar a transmitir los datos a un segundo archivo. Mi preocupación aquí es que necesito asegurarme de no sobrepasar el flujo de grabación.

Si esto no es posible o es relativamente simple, solo tendré que detectar cuándo ya no se escribe en el archivo usando alguna lógica con el último tiempo de escritura, pero estoy buscando sugerencias sobre cuál es la mejor manera de hacer esto. puede ser. Soy consciente de las soluciones propuestas Aquí, pero no estoy seguro de si se aplican a la situación con la que estoy lidiando. Hay una gran cantidad de archivos dentro de los subdirectorios, por lo que tratar de realizar un seguimiento de los archivos que ya no desencadenan eventos podría ser muy complicado. ¿Alguien tiene alguna sugerencia sobre cómo hacer cualquiera de estos métodos?

preguntado el 22 de mayo de 12 a las 17:05

3 Respuestas

Hmmm... Podrías intentar usar un temporizador... De esta manera, puedes limitar cuándo se dispara

private Boolean TimeToCheck=false;
public static void Run()
{   Timer timer=new Timer(2000); //2 seconds
    FileSystemWatcher fileWatch=new FileSystemWatcher();
    fileWatch.Path="DirToWatch";
    fileWatch.Filter="fileToWatch";
    fileWatch.Changed += new FileSystemEventHandler(OnChanged);
    fileWatch.Created += new FileSystemEventHandler(OnChanged);
    fileWatch.Deleted += new FileSystemEventHandler(OnChanged);
    //If you want rename, you could use the rename event as well  fileWatch.Renamed += new RenamedEventHandler(OnRenamed);
    timer.Elapsed += new ElapsedEventHandler(timer_done);
    watcher.EnableRaisingEvents = true;
    timer.Enabled = true; // Enable it
}

private static void OnChanged(object source, FileSystemEventArgs e)
{
    if(TimeToCheck)
    {
        TimeToCheck=false;
        timer.Enabled = false; // Enable it
        //move the files
        timer.Enabled = true; // Enable it
    }

}
private static void OnRenamed(object source, RenamedEventArgs e)
{
    if(TimeToCheck)
    {
        TimeToCheck=false;
        timer.Enabled = false; // Enable it
        //move the files
        timer.Enabled = true; // Enable it
    }
}
private static void timer_done(object sender, ElapsedEventArgs e)
{
    TimeToCheck=true;
}

contestado el 22 de mayo de 12 a las 18:05

Podría intentar hacer esto, pero para ser honesto, esto parece un truco y soy escéptico de que Windows tenga algún método compatible para hacer lo que está tratando de hacer. Esencialmente, está tratando de escuchar en una secuencia de escritura.

Parece que cualquier solución con la que esté trabajando en este momento es una caja negra, por lo que acceder a la transmisión directamente probablemente no sea una opción. Sin embargo, hay otro enfoque. Buscaría cómo puede crear una unidad virtual con su aplicación en Windows. De esa manera, puede hacer que la aplicación de grabación escriba en la ruta de su unidad virtual, lo que le permitirá manejar las transmisiones como desee. Lo que puede incluir escribirlos en dos ubicaciones separadas al mismo tiempo. Tanto la unidad de Google como algún tipo de almacenamiento local, por ejemplo.

Aquí hay una pregunta de StackOverflow sobre cómo crear unidades virtuales que debería ayudarlo a comenzar: C #: crea una unidad virtual en la computadora

contestado el 23 de mayo de 17 a las 12:05

La solución es definitivamente una caja negra, y terrible. Si el software de grabación me permitiera especificar una carpeta en lugar de una unidad para escribir los datos, ni siquiera tendría este problema. Al paso que esto va, la solución comienza a parecer que una grabadora de video diferente es más barata que pasar mucho tiempo tratando de escribir y depurar este servicio. No obstante, estudiaré tu sugerencia. Gracias. - Jared

Bueno, de cualquier manera te deseo suerte! - spencer ruport

¿Has mirado el Observador del sistema de archivos ¿objeto? Si entiendo la pregunta correctamente, puede ser algo que desee usar... Si tuviera que colocar este archivo de seguridad dentro de un directorio determinado, podría usar file.copy para mover el registro de seguridad actualizado al carpeta de google drive...

contestado el 22 de mayo de 12 a las 17:05

El servicio que he implementado hasta ahora usa FileSystemWatcher. Estoy tratando de determinar la mejor manera de manejar la gran cantidad de eventos que generará y determinar cuándo mover el archivo, y preferiblemente como una secuencia mientras se escribe, si es posible. - Jared

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.