日期:2014-05-18  浏览次数:20977 次

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

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类一起配合使用,下面我按照网上别人的思路写一下:
C# code

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方法,结束不了进程,下一下对文件的操作就出现异常。
以上是我的问题,求大神们能给个答案!!


------解决方案--------------------
FileInfo 可以单独使用

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

还有就是移动 重命名

读写 我一般用 StreamWriter StreamReader