Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在另一个应用程序写入文件时安全地复制该文件,确保两个程序都不会崩溃_C#_.net - Fatal编程技术网

C# 如何在另一个应用程序写入文件时安全地复制该文件,确保两个程序都不会崩溃

C# 如何在另一个应用程序写入文件时安全地复制该文件,确保两个程序都不会崩溃,c#,.net,C#,.net,我正在管理一个第三方供应商应用程序,它创建.txt文件并将用户日志写入此.txt文件,共有10个日志文件,每个文件的最大大小为100 mb,当所有文件都达到最大限制时,供应商应用程序将擦除最旧的文件,并开始将用户日志写入此文件。为了获得所有文件的安全永久副本,我创建了一个C#控制台应用程序,它可以复制这些日志文件(txt),并在一天内粘贴到另一个安全位置几次。但是,当我的console应用程序运行以复制.txt日志文件时,有时会与供应商应用程序的写入时间重叠,供应商应用程序会因错误而崩溃: “无

我正在管理一个第三方供应商应用程序,它创建.txt文件并将用户日志写入此.txt文件,共有10个日志文件,每个文件的最大大小为100 mb,当所有文件都达到最大限制时,供应商应用程序将擦除最旧的文件,并开始将用户日志写入此文件。为了获得所有文件的安全永久副本,我创建了一个C#控制台应用程序,它可以复制这些日志文件(txt),并在一天内粘贴到另一个安全位置几次。但是,当我的console应用程序运行以复制.txt日志文件时,有时会与供应商应用程序的写入时间重叠,供应商应用程序会因错误而崩溃:

“无法获取对当前日志文件的写入。错误:进程正在运行。” 无法访问文件“C:\FileLocation\Log01.txt”,因为它是 正在被其他进程使用。请确保日志文件 未在任何其他应用程序中打开”


我想知道是否有任何方式可以复制日志文件中的任何内容,并且供应商应用程序仍然可以访问日志文件来写入日志。因为当供应商应用程序崩溃时,它会停止将日志写入.txt文件,这可能会导致一个巨大的问题。

这是一个并发问题。有很多方法可以解决这个问题,但是当另一个应用程序访问时,所有这些方法都不会让文件只是复制,这是不可能的

请尝试以下网站:


你也可以在同一个系统中制作所有副本,这样会更轻松。但是您需要检查文件是否从其他程序打开。

尝试读取和写入字节,而不是使用
file.Copy(…)
方法。它适用于类似的情况,例如通过网络备份共享的本地数据库。希望它对你有用

var srcPath=“SourcePath…”;
var desFile=“DestinationPath…”;
var buffer=新字节[1024*1024];
var bytesRead=0;
使用(FileStream sr=newfilestream(srcPath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
使用(BufferedStream srb=新的BufferedStream(sr))
使用(FileStream sw=newfilestream(desFile,FileMode.Create,FileAccess.Write,FileShare.ReadWrite))
使用(BufferedStream swb=新的BufferedStream(sw))
{
while(true)
{
bytesRead=srb.Read(buffer,0,buffer.Length);
如果(字节读==0)中断;
写(缓冲区,0,字节读);
}
swb.Flush();
}

早安。

例如,创建一个全局或类级别的
队列
,在
try..catch
块中的
IOException
中将繁忙的文件排队,稍后使用
Peek
方法重试排队的文件,将成功复制的文件排出来。打开文件时,您可以选择允许共享()。但是,这仅适用于您是第一个获得该文件句柄的人-在第三方应用程序之前或之间。然而,我不确定这一份额有多大。如果第三方应用程序不会抛出异常,因为它无法获得文件的独占锁定。为什么不只复制第三方使用的日志?如果您需要一直运行,您可以使用FileSystemWatcher确定已创建新日志文件,然后复制此新日志文件之前的最后一个。@JQSOFT感谢您的建议,但是我的控制台应用程序没有任何问题,它会检查文件是否正在使用,如果正在使用,则跳过它并等待下一次运行进行复制。但当我的控制台应用程序发现文件未被使用,并开始复制它时,问题就会出现,在毫秒内,第三方供应商应用程序希望写入日志BOOOMMMM@Jimi谢谢你的建议,我考虑过你的解决方案,但是我需要得到当前日志文件的副本,不管它有什么日志,因为第三方供应商应用程序可能会因其他原因随时崩溃,并且当前日志文件中包含用户在崩溃前所做的事情或导致崩溃的原因的数据。当第三方应用程序崩溃时,我们无法访问日志文件,除非我们将它们移动到安全的位置。谢谢,到目前为止,这一切都很好,请继续。