Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法访问关闭的流?_C#_Stream_Streamreader_Memorystream - Fatal编程技术网

C# 无法访问关闭的流?

C# 无法访问关闭的流?,c#,stream,streamreader,memorystream,C#,Stream,Streamreader,Memorystream,我刚刚在代码中遇到了一个错误,它打开了文件并读取了原始数据 我得到的错误如下: 正如你所看到的,我正在打开一个内存流,但是当我这样做的时候,我得到了一个错误,说我不能访问这个流 我想知道为什么我不能进入一条封闭的河流 使用的代码: // Try to decompress the file data. byte[] rawData = null; using (MemoryStream zipStream = new MemoryStream(fileData)) { if (Zip

我刚刚在代码中遇到了一个错误,它打开了文件并读取了原始数据

我得到的错误如下:

正如你所看到的,我正在打开一个内存流,但是当我这样做的时候,我得到了一个错误,说我不能访问这个流

我想知道为什么我不能进入一条封闭的河流

使用的代码:

// Try to decompress the file data.
byte[] rawData = null;

using (MemoryStream zipStream = new MemoryStream(fileData))
{
    if (ZipPackage.IsZipFile(zipStream))
    {
        using (ZipPackage unzipper = ZipPackage.Open(zipStream))
        {
            // The zip package only contains one entry since GeoObject.FileData only contains one shape or POI.
            if (unzipper.ZipPackageEntries.Count > 0)
            {
                StreamReader reader = new StreamReader(unzipper.ZipPackageEntries[0].OpenInputStream());
                rawData = System.Text.Encoding.UTF8.GetBytes(reader.ReadToEnd());
            }
        }
    }
}
堆叠

at System.IO.\u错误.StreamIsClosed()
在System.IO.MemoryStream.set_位置(Int64值)
在Telerik.Windows.Zip.ZipPackage.IsZipFile(流)
在Satmap.Planner.Silverlight.XmlConverters.DBGeoObjectsToFromDBShapes.ExtractRawFileData(GeoObject GeoObject,Byte[]fileData)
位于Satmap.Planner.Silverlight.DatabaseShapesToFromMapShapes.ConvertDatabaseShapesToMapShapes(GeoObject GeoObject,布尔过滤器)
位于Satmap.Planner.Silverlight.DatabaseShapesToFromMapShapes.ConvertDatabaseShapesToMapShapes(地理对象地理对象)
位于Satmap.Planner.Silverlight.ViewController.MainMapViewController.BackgroundWorkerFileLoad\u RunWorkerCompleted(对象发送器,RunWorkerCompletedEventArgs e)
位于System.ComponentModel.BackgroundWorker.OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
位于System.ComponentModel.BackgroundWorker.b__1(对象状态)
新堆栈:

at System.IO.MemoryStream.set_Capacity(Int32 value)
at System.IO.MemoryStream.EnsureCapacity(Int32 value)
at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.Stream.InternalCopyTo(Stream destination, Int32 bufferSize)
at System.IO.Stream.CopyTo(Stream destination)
at Telerik.Windows.Zip.ZipArchive.WriteArchive()
at Telerik.Windows.Zip.ZipArchive.Dispose(Boolean disposing)
at Telerik.Windows.Zip.ZipArchive.Dispose()
at Satmap.Planner.Silverlight.XmlConverters.DBGeoObjectsToFromDBShapes.ExtractRawFileData(GeoObject geoObject, Byte[] fileData)
at Satmap.Planner.Silverlight.DatabaseShapesToFromMapShapes.ConvertDatabaseShapesToMapShapes(GeoObject geoObject, Boolean filter)
at Satmap.Planner.Silverlight.DatabaseShapesToFromMapShapes.ConvertDatabaseShapesToMapShapes(GeoObject geoObject)
at Satmap.Planner.Silverlight.ViewControllers.MainMapViewController.BackgroundWorkerFileLoad_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
at System.ComponentModel.BackgroundWorker.OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
at System.ComponentModel.BackgroundWorker.<OnRun>b__1(Object state)
at System.IO.MemoryStream.set\u容量(Int32值)
在System.IO.MemoryStream.EnsureCapacity处(Int32值)
在System.IO.MemoryStream.Write(字节[]缓冲区,Int32偏移量,Int32计数)
在System.IO.Stream.InternalCopyTo(流目标,Int32 bufferSize)
在System.IO.Stream.CopyTo(流目的地)处
在Telerik.Windows.Zip.ZipArchive.writerchive()中
在Telerik.Windows.Zip.ZipArchive.Dispose(布尔disposing)中
在Telerik.Windows.Zip.ZipArchive.Dispose()中
在Satmap.Planner.Silverlight.XmlConverters.DBGeoObjectsToFromDBShapes.ExtractRawFileData(GeoObject GeoObject,Byte[]fileData)
位于Satmap.Planner.Silverlight.DatabaseShapesToFromMapShapes.ConvertDatabaseShapesToMapShapes(GeoObject GeoObject,布尔过滤器)
位于Satmap.Planner.Silverlight.DatabaseShapesToFromMapShapes.ConvertDatabaseShapesToMapShapes(地理对象地理对象)
位于Satmap.Planner.Silverlight.ViewController.MainMapViewController.BackgroundWorkerFileLoad\u RunWorkerCompleted(对象发送器,RunWorkerCompletedEventArgs e)
位于System.ComponentModel.BackgroundWorker.OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
位于System.ComponentModel.BackgroundWorker.b__1(对象状态)

您在这里看到的是Telerik
ZipPackage
类的行为。静态
IsZipFile
方法正在处理流,可能是由于一个bug(您可以就此联系Telerik支持部门)

但是,可能没有必要先检查zip包的有效性。只需围绕相关代码片段使用
try…catch

// Try to decompress the file data.
byte[] rawData = null;

using (MemoryStream zipStream = new MemoryStream(fileData))
{
    try
    {
        using (ZipPackage unzipper = ZipPackage.Open(zipStream))
        {
            // The zip package only contains one entry since GeoObject.FileData only contains one shape or POI.
            if (unzipper.ZipPackageEntries.Count > 0)
            {
                StreamReader reader = new StreamReader(unzipper.ZipPackageEntries[0].OpenInputStream());
                rawData = System.Text.Encoding.UTF8.GetBytes(reader.ReadToEnd());
            }
        }
    }
    catch (Exception ex)
    {
         // ZipPackage throws an exception of type Exception if the 
         // package is not valid. Handle exception here, e.g. log etc
    }
}
更新 Telerik的ZipArchive类似乎是一种奇怪的野兽。如果您使用的是.NET4.5或更高版本,那么最好切换到
System.IO.Compression.ZipArchive
类。如果没有,您可以通过不从固定阵列创建内存流来解决不可扩展内存流的问题。您可以使用以下方法代替
新建内存流(fileData)

using (var zipStream = new MemoryStream())
{
    zipStream.Write(fileData, 0, fileData.Length);
    zipStream.Position = 0;

    // continue here
}

将简短的可执行代码和异常发布到包含堆栈的字符串输出。看起来zip库中有个bug。@usr我已经添加了信息。如果您需要更多,请告诉我。看起来像一个bug,内部代码崩溃。向Telerik报告。他们也希望看到样本数据进行复制,这似乎不大可能。请注意调试器的SETNEXT语句命令。谢谢您的回答。我刚刚做了更改,然后错误
内存流无法扩展。
被发现出现异常?@BenClarke:你能更新你的问题并发布新的堆栈跟踪吗?谢谢你的更新,现在一切都正常了。我可以问一下,为什么写入流可以工作,但作为参数传递不起作用?当您通过传递字节数组来创建
MemoryStream
时,内存流的大小是固定的,并且是不可执行的。您可以对其进行写入,但写入的字节数不能超过初始大小。如果您只是创建一个
内存流
,内部缓冲区的大小不是固定的,在写入时会增加。-为什么Telerik
ZipArchive
类想要写入流,尽管你所做的只是让它阅读包,我完全不知道。
using (var zipStream = new MemoryStream())
{
    zipStream.Write(fileData, 0, fileData.Length);
    zipStream.Position = 0;

    // continue here
}