簡體   English   中英

如何在另一個應用程序寫入文件時安全地復制文件,確保兩個程序都不會崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM