关于C#中的FileStream的使用问题

问题描述

我在一个文件操作类中,定义了成员变量FileStream类型的fs,在类初始化中对fs进行初始化赋值,但是发现构造函数完成之后,fs不可用了。类似代码如下:privateFileStreamfs=null;publicExcelHelper(stringfileName){this.fileName=fileName;disposed=false;fs=newFileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);if(fileName.IndexOf(".xlsx")>0)//2007版本workbook=newXSSFWorkbook();elseif(fileName.IndexOf(".xls")>0)//2003版本workbook=newHSSFWorkbook();}在构造函数完成之后,fs就变掉了,导致后面其他成员函数中使用fs出现问题,必须对fs重新初始化赋值才可用,求大神解释?

解决方案

解决方案二:
这里变掉是什么意思呢?其他代码位置有对fs进行过close或者null操作吗?
解决方案三:
privateFileStreamfs=null;改成privatestaticFileStreamfs=null;试试
解决方案四:
贴出来完整的代码,只看你贴的这堆代码,没办法分析问题。
解决方案五:
引用3楼lovelj2012的回复:

贴出来完整的代码,只看你贴的这堆代码,没办法分析问题。

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingNPOI.SS.UserModel;usingNPOI.HSSF.UserModel;usingNPOI.XSSF.UserModel;usingSystem.IO;usingSystem.Data;namespaceSystemHelper{publicpartialclassNPOIExcelHelper:IDisposable{privatestringfileName=null;privateIWorkbookworkbook=null;privateFileStreamfs=null;privatebooldisposed;publicNPOIExcelHelper(stringfileName){this.fileName=fileName;disposed=false;fs=newFileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);if(fileName.IndexOf(".xlsx")>0)workbook=newXSSFWorkbook(fs);elseif(fileName.IndexOf(".xls")>0)workbook=newHSSFWorkbook(fs);}///<summary>///往excel指定的sheet写入数据///</summary>///<paramname="data"></param>///<paramname="sheetName"></param>///<paramname="isColumnWritten"></param>///<returns></returns>publicintDataTableToExcel(DataTabledata,stringsheetName,boolisColumnWritten){intcount=0;ISheetsheet=this.getSheetByName(sheetName);if(sheet==null)return-1;try{//写入表头数据if(isColumnWritten==true){IRowrow=sheet.CreateRow(0);for(intj=0;j<data.Columns.Count;j++){row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);}count=1;}else{count=1;}for(inti=0;i<data.Rows.Count;i++){IRowrow=null;row=sheet.GetRow(count);if(row!=null){for(intj=1;j<data.Columns.Count;j++){row.GetCell(j-1).SetCellValue(data.Rows[i][j].ToString());}}else{row=sheet.CreateRow(count);for(intj=1;j<data.Columns.Count;j++){row.CreateCell(j-1).SetCellValue(data.Rows[i][j].ToString());}}count++;}workbook.Write(fs);returncount;}catch(Exceptionex){Console.WriteLine("Exception:"+ex.Message);return-1;}}///<summary>///通过sheetName获取sheet对象///</summary>///<paramname="sheetName"></param>///<returns></returns>privateISheetgetSheetByName(stringsheetName){ISheetsheet=null;//获取sheet对象if(sheetName!=null){sheet=workbook.GetSheet(sheetName);}returnsheet;}///<summary>///获取所有sheetName///</summary>///<returns></returns>publicstring[]getAllSheetNames(){intcount=workbook.NumberOfSheets;string[]res=newstring[count];for(inti=0;i<count;i++){res[i]=workbook.GetSheetName(i);}returnres;}///<summary>///获取指定sheetName的数据///</summary>///<paramname="sheetName"></param>///<returns></returns>publicDataTablegetDataFromExcelByName(stringsheetName){ISheetsheet=this.getSheetByName(sheetName);if(sheet==null)returnnull;returnthis.getDataFromSheet(sheet);}///<summary>///获取指定sheetIdx的数据///</summary>///<paramname="sheetName"></param>///<returns></returns>publicDataTablegetDataFromExcelByIdx(intidx){if(idx<0||idx>=workbook.NumberOfSheets){Console.WriteLine("sheetidx超出范围");returnnull;}returnthis.getDataFromSheet(workbook.GetSheetAt(idx));}///<summary>///从sheet对象中获取数据///</summary>///<paramname="sheet"></param>///<returns></returns>privateDataTablegetDataFromSheet(ISheetsheet){DataTabledata=newDataTable();intstartRow=0;try{if(sheet!=null){//获取第一行表头数据IRowfirstRow=sheet.GetRow(0);intcellCount=firstRow.LastCellNum;for(inti=firstRow.FirstCellNum;i<cellCount;i++){ICellcell=firstRow.GetCell(i);if(cell!=null){stringcellValue=cell.StringCellValue;if(cellValue!=null){DataColumncolumn=newDataColumn(cellValue);data.Columns.Add(column);}}}startRow=sheet.FirstRowNum+1;//获取总行数introwCount=sheet.LastRowNum;for(inti=startRow;i<=rowCount;i++){IRowrow=sheet.GetRow(i);if(row==null)continue;//没有数据的行默认为nullDataRowdataRow=data.NewRow();for(intj=row.FirstCellNum;i<cellCount;j++){if(row.GetCell(j)!=null){dataRow[j]=row.GetCell(j).ToString();}}data.Rows.Add(dataRow);}}returndata;}catch(Exceptionex){Console.WriteLine("Exception:"+ex.Message);returnnull;}}publicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}protectedvirtualvoidDispose(booldisposing){if(!this.disposed){if(disposing){if(fs!=null)fs.Close();}fs=null;disposed=true;}}}}
解决方案六:
文件流一直开在那里这么玩不好

时间: 2024-07-31 14:38:03

关于C#中的FileStream的使用问题的相关文章

请问c#中的FileStream和BinaryReader分别相当于java中的什么类

问题描述 请问c#中的FileStream和BinaryReader分别相当于java中的什么类谢谢了 解决方案 解决方案二:顶上去

在SQL Server中启用FileStream

  最近在研究在数据库中存储大数据文件,看到了FileStream 这个功能,记录下来以备后用 FileStream 一般在安装的时候默认是不启用的,如果你留意的话,在选择数据库文件路径那个窗口,有一个标签是"FileStream". 如果在安装的时候你没有启用,安装后可以通过以下设置来开启FileStream 功能. 1. 打开 SQL Server 配置管理器, 在SQL server 服务下找到你要启用的SQL Server服务(默认实例一般是 MSSQLServer),右击该服

ASP.NET中的FILESTREAM对象总结

asp.net|stream|对象 filestream对象为文件的读写操作提供通道,而file对象相当于提供一个文件句柄,在文件操作中,filestream对象的操作比较简单. 创建filestream对象 创建filestream对象可以采用file对象的create方法或open方法,也可以采用filestream对象的构造函数 使用file对象的create方法dim mikecatstream as filestreammikecatstream=file.create("c:\mik

SharePoint 2010 RBS FILESTREAM Provider中的垃圾收集

在以前的博客中,我曾经介绍过如何在SharePoint 2010系统中安装和配置RBS FILESTREAM Provider,实现将SharePoint中的文件存储到磁盘文件系统中.但是当用户在SharePoint中上载文件时,文件的二进制内容就会通过RBS FILESTREAM Provider,写入到指定的磁盘文件夹之中.通过RBS可以极大的提高SharePoint存储文件的能力,也有效的使SharePoint的内容数据库不会跟着文件数量的增多而不断膨胀. 但是当用户从SharePoint

.NET中的异步编程- IO完成端口以及FileStream.“.NET研究”BeginRead

写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型.但经过三篇文章后很多人对IO异步背后实现的原理以及为什么这样能提高性能很感兴趣.其实我本不想花更多的文字在这些底层实现的细节上,一来我并不擅长这些方面,二来我们使用.NET的异步IO就不需要关心这些底层东西,因为已经为你封装完备了.不过为了避免大家一再在这上面商讨,我还是在这个系列中间插入了一篇来解释一下. 本文我将从内核对象IO完成端口开始介绍,然后来瞧瞧.

.NET中的异步编程- IO完“.NET技术”成端口以及FileStream.BeginRead

写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型.但经过三篇文章后很多人对IO异步背后实现的原理以及为什么这样能提高性能很感兴趣.其实我本不想花更多的文字在这些底层实现的细节上,一来我并不擅长这些方面,二来我们使用.NET的异步IO就不需要关心这些底层上海企业网站制作东西,因为已经为你封装完备了.不过为了避免大家一再在这上面商讨,我还是在这个系列中间插入了一篇来解释一下. 本文我将从内核对象IO完成端口开始介

SQL Server 2008新特性——FILESTREAM

FILESTREAM简介 FILESTREAM是SQL Server 2008中的一个新特性,允许以独立文件的形式存放大对象数据,而不是以往一样将所有数据都保存到数据文件中.以往在对业务系统的文件进行管理时有两种方法,一种是将文件保存到服务器文件系统中,数据库中只保存了该文件的路径,在使用该文件时应用程序连接到服务器读取文件:另一种是将文件以varbinary(max)或image数据类型保存到SQL Server中.而SQL Server 2008提供了FILESTREAM,结合这两种方式的优

如何连接开启FileStream 的sql server2008 r2 数据库?

问题描述 如何连接开启FileStream的sqlserver2008r2数据库?C#中的连接字符串怎么写?server=initialcatalog=userid=password=除了这些还需要写什么?integratedsecurity=SSPI可以连接,但是这个只能是本地连接,远程不行,提示:域不同不能通过安全认证. 解决方案 解决方案二:远程,server=需要指定IP地址,这个IP是sql服务器配置里指定的IP,这个IP必须是公网IP,就是能在互联网访问到解决方案三:引用1楼From

SQL Server的FileStream和FileTable深入剖析_MsSql

互联网时代数据是爆炸式增长,我们常常需要把结构化数据和非结构化数据(如文档,演示文稿,视频,音频,图像)存储在一起.通常有几种方案: 1.在数据库中存储结构化数据,在文件系统中存储非结构化数据,然后数据库里有一个字段记录文件系统的路径,虽然这种方法成本合算,但它引入了额外的复杂度,因为你需要手动去保证跨关系和非关系系统管理事务的完整性. 2.将结构化数据和非结构化数据都存储在数据库中,多年以来,数据库一直都支持存储非关系数据,如二进制大对象,或BLOB,SQL Server称之为varbinar