多线程写文件的问题

ypdarling 2007-03-06 05:48:40
我用多线程调用下面的代码时,有的时候可以正确完成任务,有的时候在构造FileStream对象时出错,说是另一个进程正在访问。
查查MSDN,关于FileShare.Write部分写的是:“允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。 ”
他的最后一句话叫我很难理解,什么是附加权限?
这段程序的问题究竟出在哪里?

//创建一个FileStream对象和一个BinaryWriter对象,用于将数据写进文件
FileStream fileStream = null ;
BinaryWriter binaryWriter = null;

try
{
fileStream = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.Write);//注意Open方法的参数
}
catch(IOException e)
{
throw new IOException("构造FileStream对象时出错",e);
}

try
{
binaryWriter = new BinaryWriter(fileStream);
}
catch(IOException e)
{
fileStream.Close();
throw new IOException("构造BinaryWriter对象时出错",e);
}

try
{
//将该流的当前位置设置为适当的位置
fileStream.Seek(request.Offset, SeekOrigin.Begin);//此方法可能出现出现 I/O 错误,抛出IOException异常

//将数据块写入文件
binaryWriter.Write(request.DataBlock);//此方法可能出现出现 I/O 错误,抛出IOException异常
}
catch (IOException e)
{
throw new IOException("将数据块写入文件时出错",e);
}
finally
{
//关闭流,BinaryWriter也将关闭FileStream对象,所以无需再调用fileStream.Close()
binaryWriter.Close();
}
...全文
2134 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianrui456 2009-08-26
  • 打赏
  • 举报
回复
莫非这是个典型的多线程同步问题:解决方法可以有 lock mutex 和信号量等线程同步方法
人工智能算法 2009-08-26
  • 打赏
  • 举报
回复
给你说个我曾经用过的方法,多线程访问一个文件
建议多设置一个线程专门写文件 而其他需要操作文件的线程直接访问写文件线程
形成队列,关于队列,你可以去微软官方看资料,很多
zxj828282 2009-08-26
  • 打赏
  • 举报
回复
多线程,大麻烦。
莫聆 2009-08-25
  • 打赏
  • 举报
回复
为什么不做一个收集器之类的东西,由收集器来负责写文件,其他的线程通过收集器来同步。
xuliye 2008-03-26
  • 打赏
  • 举报
回复
飘过...无语...好久没来CSDN了,哈哈...
  • 打赏
  • 举报
回复
.net竟然没有内存映射文件 的包装机制,晕,玩具
hm7921936 2007-07-24
  • 打赏
  • 举报
回复
多线程写是允许的,但是不加锁的话写出来的东西乱七八糟的
vainnetwork 2007-07-24
  • 打赏
  • 举报
回复
可能是你另一个线程正在执行写的时候你再去打开就会包异常.这是问题.
yan63 2007-07-24
  • 打赏
  • 举报
回复
>弱弱的问一下:一个碟片同一面磁头就是一个,若文件为连续存储,有必要对磁盘文件的写入开>多线程吗?
---------------

比如多线程下载工具
-----------------
原来如此,是我想当然了。
CrazyGou 2007-07-24
  • 打赏
  • 举报
回复
>弱弱的问一下:一个碟片同一面磁头就是一个,若文件为连续存储,有必要对磁盘文件的写入开>多线程吗?
---------------

比如多线程下载工具
yan63 2007-07-24
  • 打赏
  • 举报
回复
弱弱的问一下:一个碟片同一面磁头就是一个,若文件为连续存储,有必要对磁盘文件的写入开多线程吗?
还是我没理解题意?
x719x 2007-07-24
  • 打赏
  • 举报
回复
可以尝试一下加锁和委托
qhiou 2007-07-24
  • 打赏
  • 举报
回复
还是要加锁后才能解决冲突问题
hq2008 2007-07-24
  • 打赏
  • 举报
回复
w
ProjectDD 2007-03-07
  • 打赏
  • 举报
回复
学习一下
liujia_0421 2007-03-07
  • 打赏
  • 举报
回复
TO:而不是如何解决这个问题(我会)。

那请问楼主是怎么解决的呢?分享一下..
ypdarling 2007-03-07
  • 打赏
  • 举报
回复
我是楼主。
to:liujia_0421(SnowLover)

异常是发生在fileStream = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.Write);这里的。
是打开文件时发生的,还没有写呢,所以你的理解可能不对。
我简单测试了一下,上面的语句大概是几千分之一的几率发生异常。

我现在想知道为什么这个异常会发生,而不是如何解决这个问题(我会)。
请大家踊跃发言,谢谢
ylqmf 2007-03-07
  • 打赏
  • 举报
回复
mark
cwwhy 2007-03-07
  • 打赏
  • 举报
回复
多线程写是允许的,但是不加锁的话写出来的东西乱七八糟的
heartdevil 2007-03-07
  • 打赏
  • 举报
回复
多线程写入文件是被MS允许的。要设置属性。
加载更多回复(13)

111,107

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧