gpt4 book ai didi

C# 文件读/写文件共享似乎不起作用

转载 作者:可可西里 更新时间:2023-11-01 03:12:48 25 4
gpt4 key购买 nike

我的问题是基于继承大量我无能为力的遗留代码。基本上,我有一个可以生成数据 block 的设备。一个将调用设备以创建该数据 block 的库,出于某种我不完全理解的原因,即使我想更改也无法更改,将该数据 block 写入磁盘。

此写入不是即时的,但最多可能需要 90 秒。在那个时候,用户想要获得正在生成的数据的部分 View ,所以我想要一个消费者线程来读取另一个库正在写入磁盘的数据。

在我接触这个遗留代码之前,我想使用我完全控制的代码来模拟这个问题。我正在使用 C#,表面上是因为它提供了很多我想要的功能。

在生产者类中,我使用以下代码创建一个随机数据 block :

FileStream theFS = new FileStream(this.ScannerRawFileName, 
FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read);
//note that I need to be able to read this elsewhere...
BinaryWriter theBinaryWriter = new BinaryWriter(theFS);
int y, x;
for (y = 0; y < imheight; y++){
ushort[] theData= new ushort[imwidth];
for(x = 0; x < imwidth;x++){
theData[x] = (ushort)(2*y+4*x);
}
byte[] theNewArray = new byte[imwidth * 2];
Buffer.BlockCopy(theImage, 0, theNewArray, 0, imwidth * 2);
theBinaryWriter.Write(theNewArray);
Thread.Sleep(mScanThreadWait); //sleep for 50 milliseconds
Progress = (float)(y-1 >= 0 ? y-1 : 0) / (float)imheight;
}
theFS.Close();

到目前为止,还不错。此代码有效。当前版本(使用 FileStream 和 BinaryWriter)似乎等同于(虽然速度较慢,因为复制)使用具有相同选项的 File.Open 和正在写入磁盘的 ushort[] 上的 BinaryFormatter。

但随后我添加了一个消费者线程:

FileStream theFS;
if (!File.Exists(theFileName)) {
//do error handling
return;
}
else {
theFS = new FileStream(theFileName, FileMode.Open,
FileAccess.Read, FileShare.Read);
//very relaxed file opening
}
BinaryReader theReader = new BinaryReader(theFS);

//gotta do this copying in order to handle byte array swaps
//frustrating, but true.
byte[] theNewArray = theReader.ReadBytes(
(int)(imheight * imwidth * inBase.Progress) * 2);
ushort[] theData = new ushort[((int)(theNewArray.Length/2))];
Buffer.BlockCopy(theNewArray, 0, theData, 0, theNewArray.Length);

现在,theNewArray 的声明有可能被破坏,并会导致某种读取溢出。但是,这段代码永远不会走那么远,因为它总是总是在尝试打开新的 FileStream 时中断,并出现 System.IO.IOException,表明另一个进程已打开该文件。

我正在按照 MSDN 上的 FileStream 文档中的说明设置 FileAccess 和 FileShare 枚举,但似乎我无法做我想做的事情(即,在一个线程中写入,在另一个线程中读取)。我意识到这个应用程序有点不正统,但当我涉及实际设备时,我将不得不做同样的事情,但使用 MFC。

无论如何,我忘记了什么?我想做的事情是可能的,因为它在文档中被指定为可能吗?

谢谢!嗯

最佳答案

您的消费者必须指定 FileShare.ReadWrite。

通过尝试以 FileShare.Read 的形式打开文件,您是在说“我想打开文件并让其他人同时阅读”...因为已经调用失败的编写器,您必须允许与读取器并发写入。

关于C# 文件读/写文件共享似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/124946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com