ASP.NET详解文件读写操作(读写锁定)
大部分问题如下:1 .当将一些内容写入文件时,当另一个进程/线程/后续操作想要读取文件的内容时,会报告一个异常,表明系统。IO.IOException:文件“XXX”正被另一个进程使用,因此该进程无法访问该文件。2:对一个文件执行了一些操作(读/写)后,报告系统的文件“XXX”。另一个进程正在使用IO.IOException:因此该进程无法访问此文件。第二个问题类似于1。3:对文件做了一些操作后,想删除文件,但还是报告系统。IO.IOException:文件“XXX”正被另一个进程使用,因此该进程无法访问该文件。看到这,有经验的同学应该说资源还没有释放,但也有以下几种可能。我们非常频繁地操作文件,所以我们编写特定的操作类/组件来维护文件之间的操作,这些操作要到特定的时间才能完成,比如日志。当程序启动时,我们开始写日志,直到程序关闭。但是,还需要提供一个特殊的操作(读/写/删除)来操作文件。例如,我们需要提供一个日志查看器来查看当前日志或所有日志,因此不可避免地会出现上述问题。复制代码如下:静态void writefile (filemode,fileaccess,fileshare fileshare) {console。writeline('请输入您的内容。);var内容=控制台。ReadLine();FileStream fs=新的FileStream(文件路径、文件模式、文件访问、文件共享);变量缓冲=编码。Default.GetBytes(内容);fs。写(缓冲区,0,缓冲区。长度);fs。flush();}首先,我声明了一个文件写入方法并调用了它,它将我的输入写入指定的文件。复制代码如下:writefile (filemode.create,fileaccess.write,file share . read);控制台。ReadKey();
但是,在写入文件的操作之后,我没有释放文件流的资源。因此,此时将在文件上创建一个锁。我试图在windows中删除它。
显然我不能删除这个文件。接下来,我试着读一读。复制代码如下:静态void readfile(文件访问文件访问,文件共享文件共享){filestream fs=new filestream(文件路径,文件模式。打开、文件访问、文件共享);var buffer=新字节[fs。长度];fs。位置=0;fs。读取(缓冲区,0,缓冲区。长度);控制台。写线(编码。Default.GetString(缓冲区));}我实现了一个文件读取方法并调用了它。复制代码如下:writefile (filemode.create,fileaccess.write,file share . read);读取文件(文件访问。读取,文件共享。阅读);一切都很简单,访问方式是只读的,所以应该不会和上面的写锁冲突!
然而,结果并不是我们预期的那样。为什么提示不能访问?回想一下,我之前在windows Notepad中打开过这个文件,但是没有提示文件被锁定,确实可以访问,那为什么在程序中不能访问呢?也许我们应该关注文件模式、文件访问和文件共享。也许他们是鬼魂。关于文件模式MSDN的解释指定了操作系统打开文件的方式。我认为没有必要解释这个。人们通常更经常使用它。MSDN表也很好地解释了每个枚举值的作用,所以我不再解释了。文件访问为文件读、写或读/写访问定义常数。
这个枚举用的比较多,描述也比较通俗易懂,我就不多解释了。^_^!文件认为,这种枚举类型大家都会不熟悉,甚至有些同学以前都没见过(惭愧,我只认识了一小段时间)。陌生人是陌生人,但它的力量不可低估,但是。Net帮助我们很好地包装它,以至于我们一度认为它不是一个重要的角色。好了,言归正传!包含控制其他FileStream对象对同一文件的访问类型的常数。这句话是什么意思?说实话,读一句话还是觉得很纠结。我相信很多学生读的时候都很困惑。没关系,我们先跳过吧!
看看它的成员描述,和FileAccess非常相似,所以让我们试着揭开它暂时的神秘!字面上,我们可以理解为先打开一个文件后(不释放资源),我们可以以只读方式读取文件,以免抛出文件无法访问的异常。用刚刚实现的方法,这个实验可以很容易的再次完成:复制代码如下:writefile (filemode。创建,文件访问。写,文件共享。阅读);读取文件(文件访问。读取,文件共享。阅读);
这是怎么回事?他们不是都开始读书了吗?也许只能在读取文件时设置为只读共享。我们再试一次:复制代码如下:readfile (fileaccess.read,file share . read);读取文件(文件访问。读取,文件共享。阅读);
这一次,我们可以在第一次没有释放资源的情况下再次读取,那么我们再来试试设置只读共享后是否可以写入文件:复制代码如下:readfile (fileaccess。阅读,文件共享。阅读);写文件(文件模式。创建,文件访问。写,文件共享。阅读);
首先,我正确地读取了文件的内容,但是当我试图写入一些内容时,我再次报告了一个错误。然后,根据上面的实验,我们可以知道这种只读共享只有在连续读取文件时才有效!结合文件共享的经验。用Read写,字面意思应该理解为只有写文件时,共享模式设置为Write,然后文件才能继续写,否则会抛出异常。这里好玩的时候,设置好Write后,万能的Window记事本就打不开文件了。
有了以上经验,文件共享。读写可以被认为是读写特性的结合。那么它有什么用呢?如上所述,读取文件时,读共享可以继续读但不能写,而写入文件时,写共享可以继续写但不能读,但是当我们设置写共享并想读文件时,我们该怎么办呢?只能在重装资源之前释放资源吗?不,这就是读写诞生的原因。复制代码如下:writefile (filemode.create,fileaccess.write,file share . read);读取文件(文件访问。读取,文件共享。read write);
但是,在此写入文件时,不允许将共享设置为写入。否则,读取文件时使用读写是无效的(报告异常),但所有设置都可以设置为读写。这肯定会解决日常开发中的很多麻烦。FileShare.None/FileShare.Delete有上述经历,相信你很容易理解他们两个。无表示不允许后续操作,删除表示允许您执行后续删除操作。黑盒里有什么对于文件操作,我们通常使用以下类型:复制代码如下:文件。AppendAllText(' . ');文件。附录行(.);文件。附录文本(.);FileStream fs=新的FileStream(路径,FileAccess。写);fs。写(.);实际上,他们还在内部初始化了文件模式/文件访问/文件共享。例如,File的静态方法最终将生成一个Stream实例,其中调用了私有方法。
最后,我们理解/FileShare实际上是控制文件流的“访问权限”。当然这只是介绍性的文件操作,我自己做了笔记,希望能给大家带来帮助。学长园很多前辈都写过关于文件读写锁的文章,感兴趣的同学可以搜索观看!作者:空易云。
版权声明:ASP.NET详解文件读写操作(读写锁定)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。