【问题标题】:Can I overwrite a file that's in use? (C#)我可以覆盖正在使用的文件吗? (C#)
【发布时间】:2018-11-05 16:19:49
【问题描述】:

我正在尝试覆盖文件的内容。该文件在大多数情况下都在使用。我知道如何在 Java 中执行此操作,但我不确定如何在 C# 中执行此操作。这就是我目前拥有的:

    public bool ByteArrayToFile(string fileName, byte[] byteArray)
    {
        try
        {
            using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
            {
                fs.Write(byteArray, 0, byteArray.Length);
                return true;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception caught in process: {0}", ex);
            return false;
        }
    }

我正在尝试将字节数组写入文件。我使用 WebClient 从 URL 获取字节数组。当文件正在使用时,我得到一个 IOException,它表示我无法访问该文件,因为它正在被另一个进程使用。在 Java 中,我会这样做,使用 commons-io:

FileUtils.copyInputStreamToFile(new URL(url).openStream(), target);

上面的方法对我有用,但我似乎无法在 C# 中复制它。有办法吗?

【问题讨论】:

  • 在这种情况下,您不能省略 FileShare 参数。在this post 中查找解码器环。
  • 在这种情况下,什么是好的 FileShare 参数?
  • 我不知道,当它不希望文件数据随机更改时,这通常会混淆其他进程的填充。在忙于读取文件时发生这种情况尤其有害。但是,如果不发生这种情况,FileShare.Read 将是一个起点。 FileShare.ReadWrite 消除了所有障碍。
  • 如果其他进程偶然使用 FileShare.Delete (FILE_SHARE_DELETE) 打开了文件,您可以重命名该文件并使用原始文件名创建一个新文件。

标签: c# file overwrite


【解决方案1】:

您无法覆盖 Windows 中另一个进程正在使用和锁定的文件。您需要找到具有文件句柄的进程并终止该进程以释放句柄。

如果您正在编写或控制访问文件的程序/进程,不妨考虑使用System.IO 中的以下内容:

FileStream.Lock - '防止其他进程读取或写入 FileStream'

FileStream.Unlock - '允许其他进程访问之前被锁定的全部或部分文件。'

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 2012-02-09
    • 2019-09-12
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多