文件流转换为string(二进制转换为字符串)

有个想法, 想将任意文件 保存为文本里的内容,就好像资源文件里保存图片那样。经过简单测试,基本完成了。如果发现有什么bug,希望能告诉我,好让我改进。

private   const   int  BufferSize  =   1024   *   8 ;

        
///   <summary>
        
///  将流转换成字符串
    
///   </summary>
        
///   <param name="s"> 文件留 </param>
        
///   <returns> 流的字符形式 </returns>
         public   static   string  ToBase64String(Stream s)
        {

            
byte [] buff  =   null ;
            StringBuilder rtnvalue 
=   new  StringBuilder();

            
using  (System.IO.BinaryReader br  =   new  System.IO.BinaryReader(s))
            {
                
do
                {
                    buff 
=  br.ReadBytes(BufferSize);
                    rtnvalue.Append(Convert.ToBase64String(buff));

                } 
while  (buff.Length  !=   0 );

                br.Close();
            }

            
return  rtnvalue.ToString(); ;
        }

注:上面的方法里用了StringBuilder,因为如果用string += string 会很占资源,而且BufferSize最好不要太小,以减少读取时的循环次数。

 

假如想还原成流的形式,可以用下面的代码:

/// <summary>
/// 返回一个只读流
/// </summary>
/// <param name="content">文件的二进制形式</param>
/// <returns></returns>

public   static  Stream FromBase64String( string  content)
{
       
//临时文件
   string file = Path.Combine(Setting.MailAttachmentTempDocument, Guid.NewGuid().ToString()) + ".tmp";
            
       
try
      
{
            
using (Stream sw = new System.IO.FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))
            
{
                
//缓存
        byte[] buff = new byte[BufferSize];

                StringBuilder sb 
= new StringBuilder(content);

                
int bufLenght = Convert.ToBase64String(buff).Length;
                
int startindex = 0;

                
//大于缓存数组大小的时候
                while (sb.Length - startindex >= bufLenght)
                
{
                    buff 
= Convert.FromBase64String(sb.ToString(startindex, bufLenght));
                    
//写入流
                    sw.Write(buff, 0, buff.Length);
                    startindex 
+= bufLenght;
                }


                
//小于缓存数组的时候
                if (sb.Length - startindex > 0)
                
{
                    buff 
= Convert.FromBase64String(sb.ToString(startindex, sb.Length - startindex));
                    sw.Write(buff, 
0, buff.Length);
                }


                sw.Close();
            }


            
return new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Delete);
      }

      
finally
     
{
          
if(File.Exists(file))
          
{
                  File.Delete(file);
          }

      }

}

注:这里用的是文件流,其实也可以用内存流的,其他的就没有研究了,注意的是,为了不保留生成的临时文件,在finally进行删除,但是前提是FileShare.Delete,不然删除时就会出现异常。当流 close 后文件才会不再出现。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值