当前位置: 首页 > 编程语言 > C#

使用临时文件流进行处理分享

时间:2023-04-11 10:46:15 C#

使用临时文件流进行处理假设我想定义一个TempFileStream类,它使用Path.GetTempFileName()方法来创建临时文件。当不再需要TempFileStream的对象时,必须删除临时文件,例如关闭或处置:classTempFileStream:FileStream{stringm_TempFileName=Path.GetTempFileName();publicTempFileStream(FileModefileMode):base(m_TempFileName,fileMode){}///...publicovverrideDispose(booldisposing){///???我怎样才能简单安全地实现这一目标?试试这个:publicclassTempFileStream:FileStream{publicTempFileStream():base(Path.GetTempFileName(),FileMode.Create,FileAccess.ReadWrite,FileShare.Read,4096,FileOptions.DeleteOnClose){}publicTempFileStream(FileAccessaccess):base(Path.GetTempFileName(),FileMode.Create,access,FileShare.Read,4096,FileOptions.DeleteOnClose){}publicTempFileStream(FileAccessaccess,FileShareshare):base(Path.GetTempFileName(),FileMode.Create,访问,共享,4096,FileOptions.DeleteOnClose){}publicTempFileStream(FileAccessaccess,FileShareshare,intbufferSize):base(Path.GetTempFileName(),FileMode.Create,访问,共享,bufferSize,FileOptions.DeleteOnClose){}}FileOptions.DeleteOnClose选项将确保操作系统在文件关闭时自动删除临时文件。不需要特殊的Dispose方法,因为它全部由您处理。这是一个有趣的想法,但设计困扰着我。如果您已经在设计中解决了这个问题,请原谅我。但是,如果您的设计只是对FileStream的简单包装,那么我认为这是一个微妙的问题。如果文件在流关闭时被删除,这意味着真正使用文件中数据的唯一方法是FileAccess是ReadWrite。正确的?换句话说,您将使用包含如下代码的文件:using(TempFileStreamtasnewTempFileStream()){t.Seek(0,SeekOrigin.Begin);ReadDataFromTempFile(t);我看到问题是ReadDataFromTempFile期望打开文件进行读取访问,而不是读/写访问。这为一些我认为很难发现的错误打开了大门。考虑这段代码:using(TempFileStreamtasnewTempFileStream()){MyClasso=newMyClass(o);o.TempStream=t;o.ProduceOutput();t.Seek(0,SeekOrigin.Begin);哦。处理输出();}...与此比较:MyClasso=newMyClass();字符串n=Path.GetTempFileName();使用(FileStreams=newFileStream(n,FileMode.Create,FileAccess.Write)){o.TempStream=t;o.ProduceOutput();}使用(FileStreams=newFileStream(n,FileMode.Open,FileAccess.Read)){o.TempStream=t;o.ProcessOutput();}文件.删除(n);当然,第一种方法比第二种方法更短。但是,如果ProcessOutput调用写入TempStream的方法,则第二种方法将抛出异常。(或者设置一个属性,其设置访问器引发一个事件,该事件的事件处理程序将调用写入TempStream的方法,问题可能最终会发生。)第一个将无缘无故地产生意想不到的结果。我认为,您可以通过让您的TempFileStream类使用FileAccess.Write打开底层FileStream来解决这个问题。然后实现一个关闭此FileStream的Rewind方法,并创建一个使用FileAccess.Read的新方法。如果这样做,任何试图在文件打开以供读取访问时写入的方法(反之亦然)至少会抛出异常。我知道这是一个较旧的线程,但这是一个替代解决方案。我开始实施TempFileStream,但我想要更多的并发性。我的用例涉及通过MVC将[可能MB]数据库结果导出到CSV文件。我希望在数据库查询中提供数据后立即开始下载到客户端,而不是在开始下载之前等待写入可能很大的临时文件。在此解决方案中,我在填充AnonymousPipeStream的单独线程中启动查询。然后主线程可以在数据可用时从管道的另一端拉取数据。它使用.Net4任务。希望其他人发现这很有用。-抢控制器方法:publicFileResultResultExport(ReportOptionsoptions){ResultExportrpt=newResultExport(options);HttpContext.Response.BufferOutput=false;返回文件(rpt.Export(),“文本/csv”,“results.csv”);}模型:publicResultExport{privateAnonymousPipeServerStreamWriteStream=null;publicStreamExport(){////我们将在后台//线程中触发数据库查询。它将数据写入管道的一端。我们将该管道的读取器//端返回给我们的调用者。//WriteStream=newAnonymousPipeServerStream(PipeDirection.Out);AnonymousPipeClientStreamreader=newAnonymousPipeClientStream(PipeDirection.In,WriteStream.ClientSafePipeHandle);////在后台线程中调用Execute()。//Task.Factory.StartNew(()=>Execute());////当Execute()用数据填充管道时,//将管道的读取端返回给我们的调用方。//返回阅读器;}privatevoidExecute(){////WriteStream应该只by由Export()//if(WriteStream!=null){using(StreamWritersw=newStreamWriter(WriteStream,Encoding.UTF8,4096)){////当我们从数据库中获取数据时将数据推送到StreamWriter//foreach(stringlineinExportCore()){//每行都是一组以逗号分隔的值sw.WriteLine(line);}}}}}base.Dispose(处理);//处理基本流以便不再使用文件if(disposing)File.Delete(m_TempFileName);//删除文件如果需要,你应该为File.Delete添加适当的异常处理基本上根据TempFileStream逻辑,你总是只使用一个具有唯一名称的文件被创建(这是Path.GetTempFileName所做的),你总是删除使用后。因此,无需提供接受FileMode的构造函数,因为您总是在相同的模式下使用它。以上就是C#学习教程:使用临时文件流处理分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: