1.将要更新的程序打包成rar文件,如:test.rar。(手动使用winrar程序可以正常的解压)。
2.将test.rar,以二进方式读取
代码:
//读取rar文件内容
FileStream fs = new FileStream(rarFilePath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs,Enconding.UTF-8);
Data = br.ReadBytes((int)fs.Length);
说明:
当时怀疑是读取的字符编码问题,于是尝试了UTF-8,UTF-32,ASCII,Unicode 都不能解决问题。
3.将test.rar文件的内容,插入数据表的Data字段(image类型)
4.从数据表的Data字段中读取test.rar文件的内容,保存到指定目录,文件名:test.rar(手动打开提示:the file "???" header is corrupt,中文:文件头已经损坏。)
5.使用自定义的WinRarHelper类中的方法,解压test.rar文件,test.rar文件没有解压,也不提示异常。
/// <summary>
/// 解压.rar
/// </summary>
/// <param name="inputRarFileName">输入.rar</param>
/// <param name="outputPath">输出目录</param>
public static void UnCompressRar(string inputRarFileName, string outputPath, Action<ExceptionInfo> writeLog, out string msg)
{
//rar 执行时的命令、参数
string rarCmd;
//启动进程的参数
System.Diagnostics.ProcessStartInfo processStartInfo = new System.Diagnostics.ProcessStartInfo();
//进程对象
System.Diagnostics.Process process = new System.Diagnostics.Process();
msg = "";
try
{
if (!ExistSetupWinRar)
{
throw new ArgumentException("请确认服务器上已安装WinRar应用!");
}
//如果压缩到目标路径不存在
if (!System.IO.Directory.Exists(outputPath))
{
//创建压缩到目标路径
System.IO.Directory.CreateDirectory(outputPath);
}
rarCmd = "x " + inputRarFileName + " " + outputPath + " -y";
processStartInfo.FileName = WinRarPath;
processStartInfo.Arguments = rarCmd;
processStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
processStartInfo.WorkingDirectory = outputPath;
process.StartInfo = processStartInfo;
process.Start();
process.WaitForExit();
process.Close();
process.Dispose();
msg = "解压成功!";
}
catch (Exception ex)
{
writeLog.Invoke(new ExceptionInfo() { Type = "WinRarHelper.UnCompressRar", Message = ex.Message, Detail = ex.StackTrace });
msg = "解压失败!";
}
finally
{
process.Close();
process.Dispose();
}
}
文件不需要放在数据库里,读写还慢,用ftp上传下载文件,可以的话自己写socket tcp连接做CS
兄弟,rar是二进制文件啊,你竟然想用文本编码去套路它。。。你直接获取filestream里面的二进制data就OK了的呀
文件不应该存在数据库中,而是应该存放在一个文件夹中,数据库中存储对应的路径