文件流轉換爲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 後文件纔會不再出現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章