2

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

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

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

4

3 回答 3

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;
}
于 2012-05-22T17:08:00.737 回答
0

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

于 2012-05-22T16:43:03.383 回答
0

您可以尝试执行此操作,但老实说,这似乎是一种 hack,我怀疑 Windows 是否有任何支持的方法来执行您正在尝试执行的操作。本质上,您是在尝试监听写入流。

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

这是关于如何创建虚拟驱动器的 StackOverflow 问题,可以帮助您入门:C#: Create a virtual drive in Computer

于 2012-05-22T16:46:40.027 回答