【问题标题】:Why does File.WriteAllBytes not work with .db files but work with .csv files?为什么 File.WriteAllBytes 不适用于 .db 文件但适用于 .csv 文件?
【发布时间】:2019-09-26 08:46:47
【问题描述】:

我正在尝试将表示完整文件的 Byte[] 数组写入文件。 此文件可能具有 .csv.db 扩展名。

我已经建立了一个基于 MSDN 同步套接字的同步客户端和服务器应用程序

通过 S.O 搜索后,我发现了这个 (Can a Byte[] Array be written to a file in C#?) 帖子,它似乎表明可以使用以下方法将字节数组写入文件:

 File.WriteAllBytes(string path, byte[] bytes)

我的问题是这种方法似乎适用于 .csv 文件,但不适用于 .db 文件。

为什么会这样?

下面是一些代码。

 //Client-side 
  public static void StartClient()
    {        
        byte[] bytes = new byte[9000];
        try
        {
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
            Socket sender = new Socket(ipAddress.AddressFamily,
                SocketType.Stream, ProtocolType.Tcp);

            try
            {
                sender.Connect(remoteEP);
                byte[] msg= File.ReadAllBytes("CsvOrDbPath");
                int bytesSent = sender.Send(msg);
                int bytesRec = sender.Receive(bytes);
                sender.Shutdown(SocketShutdown.Both);
                sender.Close();
            }
            catch (ArgumentNullException ane) {
                Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
            }
            catch (SocketException se) {
                Console.WriteLine("SocketException : {0}", se.ToString());
            }
            catch (Exception e)  {
                Console.WriteLine("Unexpected exception : {0}", e.ToString());
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }



//Server-side
    public static string data = null;
    public static void StartListening()
    {
        byte[] bytes = new byte[9000];
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
        Socket listener = new Socket(ipAddress.AddressFamily,
            SocketType.Stream, ProtocolType.Tcp);
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(10);
            while (true)
            {
                Socket handler = listener.Accept();
                data = null;
                while (true)
                {
                    int bytesRec = handler.Receive(bytes);
                    int expecting = 8; //expected number of bytes
                    string path = "CSVorDbPath";

                    // Need to encode back into .db file format somehow
                    // Works for csv

                     File.WriteAllBytes(path, bytes);
                    break;
                }
                //Echo the data back to the client.
                //byte[] msg = Encoding.ASCII.GetBytes(data);
                //handler.Send(msg);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

当我使用 .csv 文件时,此过程在一定程度上有效,并且我在我的服务器计算机上收到了相同的文件。 当我使用 .db 文件时,程序会生成 .db 文件,但它无法打开。

我怀疑问题是由于我没有将 .db 数据编码为适当的格式 - 请有人解释发生了什么?

【问题讨论】:

    标签: c# arrays database csv sockets


    【解决方案1】:

    您正在将整个 9000 字节的缓冲区写入文件。如果接收到的文件小于这个值,则意味着在磁盘上的文件中也写入了一堆 0 字节。 打开 CSV 文件的软件可能不关心并丢弃那些额外的数据,但 db 格式的软件可能更严格。

    尝试仅将接收到的字节数写入文件,例如使用 Linq:

    File.WriteAllBytes(path, bytes.Take(bytesRec).ToArray());
    

    【讨论】:

    • 如果您不想写入数组的全部内容,我会使用using (var file = File.Create("filename")) file.Write(bytes, 0, bytesRec); 以避免对数据进行无意义的复制。
    • 我同意,有一些更聪明的方法,但我想保留最初的想法。不过值得注意。
    • @Jens 感谢您的回复。我现在只将接收到的字节数写入文件,这是一个很大的改进。不幸的是,.db 文件仍然拒绝打开。 :(
    • @MatthewWatson 谢谢,这是一个很好的技术和改进,但是 .db 文件无法打开的问题仍然存在。
    • @xor31four 在字节级别比较源文件和写入磁盘的文件,例如使用十六进制编辑器(您可以使用在线编辑器,例如 hexed.it )。另请注意,您可能没有在一次读取操作中收到完整的数据,因为它会随着时间的推移而流入。这里有点复杂,所以先比较文件看看有什么不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2019-01-17
    相关资源
    最近更新 更多