如何多次打开文件

问题描述 投票:1回答:2

我试图打开文件以进行读/写访问,然后再次打开它,仅用于读访问,但是我不断收到错误消息,表明第二次无法访问该文件,因为该文件已被另一个进程使用(第一个)。

// Open a file for read/write and then only for read without closing the firts stream

string FileName = "C:\\MisObras\\CANCHA.REC"; // Replace this with any existing folder\file 
FileStream File1 = null,
        File2 = null;
try
{
    File1 = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
    MessageBox.Show("File1 is Open for Read/Write", "", MessageBoxButtons.OK, MessageBoxIcon.Information);

    File2 = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
    MessageBox.Show("File2 is Open for Read", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
} catch (Exception e)
{
    System.Windows.Forms.MessageBox.Show (e.Message,"Error de Archivo", System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Error);
}

if (File1 != null) File1.Close();
if (File2 != null) File2.Close();

我了解参数“ FileShare.Read”使我能够再次打开文件以进行读取,而无需关闭第一个流。有人可以告诉我我的错误在哪里吗?

c# filestream
2个回答
0
投票

比较访问模式和共享模式。

File1是打开的FileAccess.ReadWrite和FileShare.Read-我认为您打算这样做。

File2是打开的FileAccess.Read和FileShare.Read。但是,File1可以打开FileAccess.ReadWrite。打开仅允许读取,因此失败。

您的第二次打开需要FileShare.ReadWrite才能正常工作。提防缓存问题。


-1
投票

您有一些可能无关的错误,即没有正确处理文件连接。但这不是唯一的错误。异常处理是我的宠儿,这很糟糕。通常,将这两篇文章链接在一起可以使人们快速入门:

问题所在:

您打开文件两次XY Problem的整个想法。您应该回去。分开存储用于读写的指针应该很容易。或者只是不需要两个代码一起处理。

关于这个问题。这些购股权中的每一个在结尾处都有这句话:

但是,即使指定了此标志,访问文件仍可能需要其他权限。

因此可能是操作系统或文件系统不允许多个文件连接。

但是即使OS阻止了它,也有一种方法-Memory Mapped Files。虽然主要是一种“进程间通信”方法,但在同一个进程中可能有两个连接(我需要检查一下,因为它可能具有Singelton模式)。这也意味着您必须使用非托管指针。

© www.soinside.com 2019 - 2024. All rights reserved.