[英]How to safely copy file while another app writing in it, make sure both program not crash
我正在管理一個 3rd 方供應商應用程序,該應用程序創建 .txt 文件並將用戶日志寫入此 .txt 文件,總共有 10 個日志文件,每個文件的最大大小為 100 mb,當全部達到最大限制時,供應商應用程序會擦除最舊的一個,並開始將用戶登錄寫入這個。 為了獲得所有文件的安全和永久副本,我創建了一個 C# 控制台應用程序,用於復制這些日志文件 (txt) 並在一天內多次粘貼到另一個安全位置。 但是,當我的控制台應用程序運行以復制 .txt 日志文件時,有時它會與供應商應用程序的寫入時間重疊,並且供應商應用程序會因錯誤而崩潰:
“無法寫入當前日志文件。錯誤:進程無法訪問文件'C:\\FileLocation\\Log01.txt',因為它正被另一個進程使用。請確保日志文件沒有打開在任何其他應用程序中”。
我想知道是否有任何方式可以復制日志文件中的任何內容,並且供應商應用程序仍然可以訪問日志文件來寫入日志。 因為當供應商應用程序崩潰時,它會停止將日志寫入 .txt 文件,這會導致一個大問題。
嘗試讀取和寫入字節而不是使用File.Copy(...)
方法。 它在類似情況下對我有用,例如通過網絡備份共享的本地數據庫。 希望它對你有用。
var srcPath = "SourcePath...";
var desFile = "DestinationPath...";
var buffer = new byte[1024 * 1024];
var bytesRead = 0;
using (FileStream sr = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream srb = new BufferedStream(sr))
using (FileStream sw = new FileStream(desFile, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
using (BufferedStream swb = new BufferedStream(sw))
{
while(true)
{
bytesRead = srb.Read(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
swb.Write(buffer, 0, bytesRead);
}
swb.Flush();
}
再會。
這是一個並發問題。 有很多方法可以解決這個問題,但是當另一個應用程序訪問它時,所有這些方法都不會使文件只是復制,這是不可能的。
試試這個網站: https : //www.oreilly.com/library/view/concurrency-in-c/9781491906675/ch01.html
您也可以在同一個系統中制作所有副本,這樣更容易。 但是您需要檢查該文件是否是從另一個程序打開的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.