-1

我们正在尝试在 SQL 中存储一个可执行(exe)文件。无论是写入还是读取,我们都没有收到错误。只是我们存储的文件在下载回来后不起作用。

这是我们存储文件的方式:

databaseFilePut(@"FilePath", con, dt.Rows[0].ItemArray[0].ToString(), "ASIL");

这是函数的内部:

public static void databaseFilePut(string varFilePath, SqlConnection con, string version, string OFSET )
        {
            byte[] file;
            using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read))
            {
                using (var reader = new BinaryReader(stream))
                {
                    file = reader.ReadBytes((int)stream.Length);
                }
            }
            using (var sqlWrite = new SqlCommand("UPDATE ERP_TOOL_UPDATE SET Version=@Version1, ExeDosyasi= @ExeDosyasi1, OFSET= @OFSET1", con))
            {
                sqlWrite.Parameters.AddWithValue("@Version1", (double.Parse(version) + 1).ToString());
                sqlWrite.Parameters.Add("@ExeDosyasi1", SqlDbType.VarBinary, file.Length).Value = file;
                sqlWrite.Parameters.AddWithValue("@OFSET1", "ASIL");
                sqlWrite.ExecuteNonQuery();
            }
        }

保存到数据库后,数据如下:

0x4D5A90000300000004000000FFFF0000B8000....然后继续。

阅读后,我们尝试使用以下代码重新创建存储的 exe:

SqlCommand com = new SqlCommand("Select ExeDosyasi From ERP_TOOL_UPDATE WHERE OFSET = 'ASIL' ", con);
            com.CommandType = CommandType.Text;
            SqlDataReader reader = com.ExecuteReader();
            reader.Read();

            byte[] blob;
            byte[] blob2;

            blob = (byte[])reader[0];

            blob2 = System.Text.Encoding.Default.GetBytes(System.Text.Encoding.Unicode.GetString(blob));

            using (var fs = new FileStream(@"C:\Users\Bilal\Desktop\ERPAnalizTool.exe", FileMode.Create, FileAccess.Write))

            {
                fs.Write(blob2, 0, blob2.Length);
                fs.Flush();
            }

我们没有收到任何错误,它保存了文件。只是问题是文件的大小有点小。当我们尝试运行时,它不会运行。就像它以前从来不是一个exe一样。

任何帮助,将不胜感激。谢谢你们。

4

1 回答 1

1

您的问题是以下行:

blob2 = System.Text.Encoding.Default.GetBytes(System.Text.Encoding.Unicode.GetString(blob));

blob变量包含您写入数据库的字节,即databaseFilePut方法中读取的文件的内容。完全没有理由将其转换为 Unicode 字符串,然后再转换为系统默认编码(我的系统上的 Windows-1252)。数据不是字符串,它是二进制的。双重转换只会产生一个错位的字节序列。

只需将blob变量写入磁盘:

blob = (byte[])reader[0];
File.WriteAllBytes(@"C:\Users\Bilal\Desktop\ERPAnalizTool.exe", blob);
于 2020-08-12T09:38:19.703 回答