2012-05-22 35 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; 
}