有个想法, 想将任意文件 保存为文本里的内容,就好像资源文件里保存图片那样。经过简单测试,基本完成了。如果发现有什么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 后文件才会不再出现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步