读书人

Stream 如何操作呢?一直出错

发布时间: 2013-07-26 11:27:42 作者: rapoo

Stream 怎么操作呢?一直出错



string file= @"C:\Users\Administrator\Desktop\明星证件照\陈好.jpg";
Stream stream = Stream.Null;
using (var fs = File.Open(file, FileMode.Open))
{
stream = fs;
}

uploadPartRequest.InputStream = stream;
ossClient.UploadPart(uploadPartRequest); //出错:Cannot access a closed file

没接触过文件流,想问这应该怎么操作?
[解决办法]
打开完 要关闭的
[解决办法]
Cannot access a closed file :这个你猜也猜的到吧.
using (var fs = File.Open(file, FileMode.Open))
{
stream = fs;
}
你把流关闭了,所以后面报错了.
[解决办法]
StreamReader sr = new StreamReader(file); File.Open 和 Stream是不一样的一个是打开文件 一个是打开文件流,一个是真实打开文件 一个并没有打开文件 要读取图片的文件流的话可以这么写
FileStream fs = null;byte[] buffer = null;try{    if (File.Exists(file)) //图片文件的全路径字符串    {       fs = new FileStream(file, FileMode.Open);       buffer = new byte[fs.Length];       fs.Read(buffer, 0, int.Parse(fs.Length.ToString()));       fs.Close();       fs.Dispose();    }}catch{     fs.Close();     fs.Dispose();}return buffer;//图片文件的流 


[解决办法]

FileStream fs = null;
byte[] buffer = null;
try{
if (File.Exists(file)) //图片文件的全路径字符串
{
fs = new FileStream(file, FileMode.Open);
buffer = new byte[fs.Length];
fs.Read(buffer, 0, int.Parse(fs.Length.ToString()));
fs.Close();
fs.Dispose();
}
}catch{
fs.Close();
fs.Dispose();
}
return buffer;//图片文件的流

[解决办法]
uploadPartRequest.InputStream = fs; ossClient.UploadPart(uploadPartRequest); 这个需要的话 写在第8行后面
[解决办法]
引用:
Quote: 引用:

Cannot access a closed file :这个你猜也猜的到吧.
using (var fs = File.Open(file, FileMode.Open))
{
stream = fs;
}
你把流关闭了,所以后面报错了.
我关闭啦,什么stream.close().fs.close(). 不管用啊


看提示的话,不应该关吧,提示的错误是Cannot access a closed file,无法获取已经关闭的文件,楼主是不是把文件关闭之后又对文件进行操作了?看看ossClient.UploadPart(uploadPartRequest)里有这种操作没
[解决办法]
uploadPartRequest.InputStream = fs; 这一步我想不需要了 这是为了将字符串转为文件流,后面那句是做什么的呢? ossClient.UploadPart(uploadPartRequest); 这个方法怎么样的能看下么
[解决办法]
Using作用域结束后,就会释放它定义的对象,所以关闭了
把 你的逻辑写在Using 作用域里面
大概改成这样试试

string file = @"C:\Users\Administrator\Desktop\明星证件照\陈好.jpg";
using (FileStream stream = new FileStream(file,FileMode.Open))
{


uploadPartRequest.InputStream = stream;
ossClient.UploadPart(uploadPartRequest);
}


[解决办法]
using (var fs = File.Open(file, FileMode.Open))
{
stream = fs;
}
上边执行完 filestream已经关闭了
再执行下边的语句是不行的啊
uploadPartRequest.InputStream = stream;

把下边的代码移到 using作用域中
或去掉using 手动释放资源
[解决办法]
建议查查using是干嘛的

[解决办法]
把using搞清楚就行了。
[解决办法]
意思是不让你关闭
[解决办法]
晕...初学者一般都不会用 using的...你知道using是什么歌样子的么...不懂也用...
看我这个链接...
Using
using 是用于实现 IDispose 接口的...
[解决办法]
引用:
晕...初学者一般都不会用 using的...你知道using是什么歌样子的么...不懂也用...
看我这个链接...
Using
using 是用于实现 IDispose 接口的...

同意
[解决办法]
using 表示在结束的时候会回收块内的内存,就是释放掉所占用的资源,也就是说,你的fs在using块之后已经释放掉了
[解决办法]
大致是这样的

var buffer= new Byte[409600];
stream = new MemoryStream();
using (var fs = File.Open(file, FileMode.Open))
{
var len =0 ;
while((len= fs.Read(buffer, 0, buffer.Length))>0)
stream.Write(buffer, 0, len);
}


如果考察一个学生有没有在学校里学过这类代码,那么就问它“如何在两个stream之间拷贝数据”这个题目就行了!
------解决方案--------------------


这个跟Using其是没有非常直接的关系,只有间接关系。lz的代码,明显地它是想问“stream怎么拷贝数据”,否则它就不会额外地声明一个stream变量,而直接把fs变量赋值给 uploadPartRequest.InputStream 就行了。
[解决办法]

引用:
Using作用域结束后,就会释放它定义的对象,所以关闭了
把 你的逻辑写在Using 作用域里面
大概改成这样试试

string file = @"C:\Users\Administrator\Desktop\明星证件照\陈好.jpg";
using (FileStream stream = new FileStream(file,FileMode.Open))
{
uploadPartRequest.InputStream = stream;
ossClient.UploadPart(uploadPartRequest);
}


是可以这样的。

不过在大规模并发测试中,这通常会出错。因为我们难以肯定UploadPart方法可以瞬间就结束。

读书人网 >C#

热点推荐