2012-05-22 32 views
2

我目前正在使用Windows服务从我们的安全摄像头复制数据,因为它正在写入计算机上的Google Drive目录以供即时上传。这些文件可以在提供的播放软件创建后立即访问,因此我们希望如果可能立即复制数据流,即使记录中断(文件为10分钟的时间段),我们也有一些视频。如何在C中编写文件时复制文件#

我目前有一个服务创建,可以观看目录,但我有一些困难,确定观看这些文件的最佳方式。由于他们连续修改10分钟,我会收到大量的变更事件。我希望有一种方法可以捕获最初的创建并开始将数据流式传输到第二个文件。我在这里担心的是我需要确保不会超出录制流。

如果这不可能或相对简单,那么我将只需要检测何时该文件不再被写入,通过使用最后写入时间的某些逻辑,但我正在寻找什么是最好的这样做的方式可能是。我知道提出的解决方案Here,但我不确定它们是否适用于我正在处理的情况。在子目录内有大量文件,所以试图跟踪哪些文件不再触发事件会变得非常混乱。有没有人有任何建议如何做这两种方法?

回答

0

你可以尝试做到这一点,但说实话,这似乎是一个黑客,我怀疑Windows有任何支持的方法来做你想做的事情。本质上,你试图在一个写入流中聆听。

听起来像你现在使用的任何解决方案都是黑盒子,所以直接访问流可能不是一种选择。但是,还有另一种方法。我会研究如何在Windows中使用您的应用程序创建虚拟驱动器。这样,您可以将录制应用程序写入您的虚拟驱动器路径,这将允许您处理不管您喜欢的流。其中可以包括将它们同时写入两个单独的位置。例如,Google驱动器和某种本地存储都是如此。

这里有一个关于如何创建应该让你开始虚拟驱动器出现StackOverflow问题:C#: Create a virtual drive in Computer

+0

这个解决方案绝对是一个黑盒子,而且是一个可怕的解决方案。如果录制软件允许我指定一个文件夹而不是驱动器来写入数据,我甚至不会有这个问题。按照这样的速度,解决方案开始看起来像一个不同的录像机比花费大量时间试图编写和调试此服务要便宜。不过,我会研究你的建议。谢谢。 – Jared

+0

好吧,无论如何,我祝你好运! –

0

你看过FileSystemWatcher这个对象吗?如果我正确地理解了这个问题,它可能是你可能想要使用的东西....如果你要把这个安全文件放在一个特定的目录中,你可以使用file.copy将更新后的安全日志移动到谷歌驱动器文件夹...

+0

到目前为止我已经实现的服务使用FileSystemWatcher。我正在尝试确定处理它将生成的大量事件的最佳方法,并确定何时移动文件,并且最好是在可能的情况下以流的形式写入。 – Jared

1

嗯......你可以尝试使用定时器......这样一来,你可以火灾时

限制
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; 
}