【问题标题】:How to copy a file as it is being written in C#如何复制正在用 C# 编写的文件
【发布时间】:2012-05-22 16:34:19
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 解决方案绝对是一个黑匣子,而且非常糟糕。如果录制软件允许我指定一个文件夹而不是驱动器来写入数据,我什至不会有这个问题。按照这种发展速度,解决方案开始看起来像一个不同的录像机比花费大量时间尝试编写和调试该服务更便宜。不过,我会考虑你的建议。谢谢。
      • 不管怎样,祝你好运!
      【解决方案3】:

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

      【讨论】:

      • 目前我实现的服务使用了FileSystemWatcher。我正在尝试确定处理它将生成的大量事件的最佳方法,并确定何时移动文件,如果可能的话,最好作为正在写入的流。
      猜你喜欢
      • 2013-10-02
      • 2015-11-04
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2012-06-25
      • 2017-01-18
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多