如何在C#中编写文件时复制文件

时间:2012-05-22 16:34:20

标签: c# windows-7 file-io google-drive-api

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

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

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你可以尝试这样做,但说实话,这似乎是一个黑客,我怀疑Windows有任何支持的方法来做你正在尝试做的事情。基本上你是在尝试收听写入流。

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

以下是有关如何创建可让您入门的虚拟驱动器的StackOverflow问题:C#: Create a virtual drive in Computer