求助:关于文件操作FileInfo类、File类与FileStream类的关系

yhj8848 2012-04-22 05:07:58
各位大神,以前在对文件进行读写和创建删除操作时,读写使用的是StreamWriter和StreamReader两个类,创建或者删除时就用Fileinfo类和FileSteam类配合着使用,一直不理解这几个概念,这几天有空静下心来看看深入学习,发现其实很多不明白的地方,下面我我边写代码边提疑问,希望高手能指点江山。
现在编一段代码,要实现在D盘根目录下创建一个文件夹,文件夹名称为测试,然后在该文件夹下新建一个文件名为test的文本文件,再把一段字符串写入这个文件内:

string str ="D:\\测试";
DirectoryInfo filedir = new DirectoryInfo(str);
filedir.Create(); //建立目录
FileInfo file = new FileInfo(str + "\\test.txt");
file.Create(); //新建文件
StreamWriter sw = new StreamWriter(str + "\\test.txt");
sw.Write("测试看看"); //写入文件
sw.Close();

当运行上面这段代码是会发生异常,提示"对路径“D:\测试”的访问被拒绝"。就是在文件新建完成时,没有进行内存释放,导致下面对这个文件文件进行写入操作时发生异,而且Fileinfo类里没有类似于.Close()这些释放内在的方法,我在网上看了一下几个前辈写的代码,发现在他们都是使用FileSteam类和Fileinfo类一起配合使用,下面我按照网上别人的思路写一下:

string str ="D:\\测试";
DirectoryInfo filedir = new DirectoryInfo(str);
filedir.Create(); //建立目录
FileInfo file = new FileInfo(str + "\\test.txt");
FileStream f= file.Create(); //新建文件 注意:这里把file.Create()赋值给了FileSteam类的变量f
f.Close(); //释放内存
StreamWriter sw = new StreamWriter(str+"\\test.txt");
sw.Write("测试看看"); //写入文件
sw.Close();

上面这段代码就能运行通过了。
我一直不理解为什么FileInfo类里没有释放内存的方法,FileInfo类和FileStream类究竟是什么关系,当然我这次看书里也基本上了解了File类是FileInfo的静态形式。但是它自身同样也没有内存释放的方法,必须配合FileStream类使用,因为FileStream类有内存释放方法,另外,我通过Visual Studio对像浏览器里看到,FileStream类的基类是Stream类,而FileInfo类的基类应该是FileSystemInfo类,从类继承这方面来看,FileInfo类和FileStream类没有直接联系啊,我就是搞不明白,为什么FileInfo类不能单独使用(没有类似Close方法),看书里面讲的也很笼统,书里面涉及到两个概念:文件和流,但是FileInfo类是专门对文件的操作,涉及那些流的概念啊,假设我就是为了创建一个文件,创建完了我就结束这个创建进程,再进行下一步的操作,但是FileInfo类没有Close方法,结束不了进程,下一下对文件的操作就出现异常。
以上是我的问题,求大神们能给个答案!!
...全文
665 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alin------ 2013-11-08
  • 打赏
  • 举报
回复
本来还明白点,这一下子。。。。。 系统有个垃圾回收的东西,能行吗??? 反正是不知道什么时候用FILE,什么时候用FILEINFO ,STREAM
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
没救了。。。。。。
你不赋值他也返回,只是1返回就扔垃圾箱而已
不是你不赋值 他就没有用到FileStream了
yhj8848 2012-04-22
  • 打赏
  • 举报
回复
QQ能给我吗?前辈
yhj8848 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

打个比方;c#不知道叫啥 无论你赋值不赋值 Create 都执行了 ,这里有什么好纠结的,纠结的我都蛋疼了
引用 12 楼 的回复:

引用 11 楼 的回复:

那就是个匿名函数嘛,你买了把镰刀 付了钱,自己不拿走;回家想去割稻谷,却报怨没工具割~~~
引用 10 楼 的回复:

引用 9 楼 的回复:

我觉得 你赋值不赋值 他都在那 没有任何差异引用 7 楼 ……
[/Quote]
执行是都执行了,但是释放不了对像啊
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
打个比方;c#不知道叫啥 无论你赋值不赋值 Create 都执行了 ,这里有什么好纠结的,纠结的我都蛋疼了
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:

那就是个匿名函数嘛,你买了把镰刀 付了钱,自己不拿走;回家想去割稻谷,却报怨没工具割~~~
引用 10 楼 的回复:

引用 9 楼 的回复:

我觉得 你赋值不赋值 他都在那 没有任何差异引用 7 楼 的回复:

但是解决的方法可看网上有就是把file.Create()赋值给FileStream的变量后,就有Close方法了

如果不把……
[/Quote]
yhj8848 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

那就是个匿名函数嘛,你买了把镰刀 付了钱,自己不拿走;回家想去割稻谷,却报怨没工具割~~~
引用 10 楼 的回复:

引用 9 楼 的回复:

我觉得 你赋值不赋值 他都在那 没有任何差异引用 7 楼 的回复:

但是解决的方法可看网上有就是把file.Create()赋值给FileStream的变量后,就有Close方法了

如果不把file.Create()赋值给F……
[/Quote]
匿名函数?还没有学到这个。好像在委托那章里有,那章我先跳过去了
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
那就是个匿名函数嘛,你买了把镰刀 付了钱,自己不拿走;回家想去割稻谷,却报怨没工具割~~~
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

我觉得 你赋值不赋值 他都在那 没有任何差异引用 7 楼 的回复:

但是解决的方法可看网上有就是把file.Create()赋值给FileStream的变量后,就有Close方法了

如果不把file.Create()赋值给FileStream的变量的话,我就没有办法进行释放
[/Quote]
yhj8848 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

我觉得 你赋值不赋值 他都在那 没有任何差异引用 7 楼 的回复:

但是解决的方法可看网上有就是把file.Create()赋值给FileStream的变量后,就有Close方法了
[/Quote]
如果不把file.Create()赋值给FileStream的变量的话,我就没有办法进行释放
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
我觉得 你赋值不赋值 他都在那 没有任何差异[Quote=引用 7 楼 的回复:]

但是解决的方法可看网上有就是把file.Create()赋值给FileStream的变量后,就有Close方法了
[/Quote]
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:

C# code

file.Create(); //新建文件


默认情况下,将向所有用户授予对新文件的完全读/写访问权限。

文件被独占建立了 在没有释放前 你的StreamWriter 无法再次调用

对就是你说的这个问题,我一直理解不了,因为新建以后,FileInfo类没有释放内存的方法,所以就不能进行下一步对它的操作
[/Quote]
System.IO.FileStream fl = file.Create(); //新建文件

新建返回的对象 就是 FileStream

这个对象对新建的文件独占访问,释放这个对象就可以
yhj8848 2012-04-22
  • 打赏
  • 举报
回复
但是解决的方法可看网上有就是把file.Create()赋值给FileStream的变量后,就有Close方法了
yhj8848 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

C# code

file.Create(); //新建文件


默认情况下,将向所有用户授予对新文件的完全读/写访问权限。

文件被独占建立了 在没有释放前 你的StreamWriter 无法再次调用
[/Quote]
对就是你说的这个问题,我一直理解不了,因为新建以后,FileInfo类没有释放内存的方法,所以就不能进行下一步对它的操作
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
System.IO.FileStream fl = file.Create();  //新建文件    
fl.Close();

你要的close在这里
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复

file.Create(); //新建文件

默认情况下,将向所有用户授予对新文件的完全读/写访问权限。

文件被独占建立了 在没有释放前 你的StreamWriter 无法再次调用
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
FileInfo 可以单独使用

我一般用他判断文件是否存在,存在就删除

还有就是移动 重命名

读写 我一般用 StreamWriter StreamReader
yhj8848 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

C# code
FileStream f= file.Create(); //新建文件 注意:这里把file.Create()赋值给了FileSteam类的变量f
f.Close();

这个无用,因为StreamWriter 可以写入到不存在的文件里,只要目录存在

DirectoryInfo 创建目录,先判断目录是否存在

StreamWriter ……
[/Quote]
谢谢,我又学到了一点新知识,不过除这个以外,我还是想弄明白,FileInfo类和FileStream类究竟是什么关系,为什么FileInfo类不能单独使用?
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
FileStream f= file.Create();  //新建文件 注意:这里把file.Create()赋值给了FileSteam类的变量f            
f.Close();

这个无用,因为StreamWriter 可以写入到不存在的文件里,只要目录存在

DirectoryInfo 创建目录,先判断目录是否存在

StreamWriter 写入文件 先判断写入文件的文件夹是否存在

111,126

社区成员

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

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

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