【问题标题】:C# Copy a File That is Being Written ToC# 复制正在写入的文件
【发布时间】:2013-10-02 03:13:15
【问题描述】:

我已经阅读了很多关于这个主题的其他帖子,但似乎没有一个可以直接解决我的问题(这让我感到惊讶)。

无论如何...我写了一个日志解析器,非常简单,我希望在解析之前从本地远程机器复制一个文件。我正在尝试复制的文件不断被写入,并且我在复制它时“随机”成功。有时它会起作用,有时我会收到“访问被拒绝”或 FileAccess 错误。其他几点:

  • 每当我使用 Windows 资源管理器将文件复制到本地时,我从来没有
    复制时遇到问题(这让我相信它是完美的
    可以 100% 的时间复制文件)。
  • 我始终可以在删除位置使用文本编辑器打开文件。
  • 我不拥有正在写入的文件,也不希望以任何方式“锁定”它,以免实际写入该文件的应用程序失败。

有人对如何复制此文件有任何建议吗?

我当前使用的命令是:

File.Copy(this.txt_log_file_to_analyze.Text, sLogFileToAnalyze,true);

【问题讨论】:

  • this.txt_log_file_to_analyze.Text 值的调试示例将帮助我们确定您远程访问这台机器的准确程度(操作系统映射驱动器、FTP 等)
  • 您是否尝试过new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read) 以确保仅在“读取”模式下打开它?您可以将其写入内存流或将其保存到文件等中。
  • 文件大小会很大吗??
  • 其实我不认为你必须复制文件,如果文件的所有者用足够的共享选项打开它来读取它,而所有者正在写入它(在你的情况下是因为你说有可能),那么您可以仅以读取模式打开文件并处理您读取的内容。
  • 我使用的是 UNC \\\。

标签: c# copy


【解决方案1】:

我猜你必须使用以下方法打开文件:

File.Open(this.txt_log_file_to_analyze.Text,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)

然后“手动”复制文件的内容,即

using (var from = File.Open("path", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var to = File.OpenWrite("to_path"))
{
    from.CopyTo(to);
}

或者如果 .NET 4.5 参见 How do I copy the contents of one stream to another?

使用上面的api,你可以指定你不想独占访问文件。

【讨论】:

  • 这正是我要说的
  • 太棒了!!!。两个问题。如果在我运行这些语句时远程文件继续被写入会发生什么?命令会完成吗?如果该文件在本地存在,我可以覆盖吗?
  • 命令会完成吗?我不知道-以前从未尝试过。覆盖to文件?使用当前的 File.OpenWrite,它将打开一个现有文件,不确定它是否会追加或覆盖,但使用 File.Open 作为“to”,您再次拥有更多控制权。
  • 我试过了,结果如下:编辑文件时 File.Open 停止复制过程。我不能使用 Stream.CopyTo,因为我的用户不在 .NET 4.5 上。还有其他建议吗?
  • 所以这是我为测试它所做的(暂时还不想接触我的生产文件)。我使用记事本++ (75MB) 打开了一个文件在“File.Open”部分,我编辑了文件并保存了。那是复制停止的时候。我将 FileShare.ReadWrite 切换为 FileShare.Read,在复制过程中,我无法编辑文件(我假设这意味着应用程序在我复制时无法写入)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2020-10-01
  • 2013-12-18
  • 2016-06-02
  • 2015-02-15
  • 2020-12-21
相关资源
最近更新 更多