Почему File.WriteAllBytes не работает с файлами .db, но работает с файлами .csv? - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь записать массив Byte [], представляющий полный файл в файл.Этот файл может иметь расширение .csv или .db .

Я настроил синхронное клиентское и серверное приложение на основе MSDN Synchronous Sockets

После поиска через SO я обнаружил этот пост ( Можно ли записать массив Byte [] в файл на 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 в соответствующий формат - пожалуйста, кто-нибудь может объяснить, чтопроисходит?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Вы записываете весь 9000-байтовый буфер в файл.Если полученный файл меньше этого, это означает, что в файл на диске записывается также набор из 0 байтов.Программное обеспечение, открывающее файл CSV, вероятно, не заботится и отбрасывает эти дополнительные данные, но программное обеспечение формата db, вероятно, более строгое.

Попробуйте записать только полученное количество байтов в файл, например, используя Linq:

File.WriteAllBytes(path, bytes.Take(bytesRec).ToArray());
0 голосов
/ 27 сентября 2019

Для тех, кто читает этот пост - проблема с открытием .db была вызвана тем, что буфер байтов не был достаточно большим, чтобы вместить все данные, прочитанные за одну операцию.Файл .db на самом деле был близок к 8 МБ, а НЕ 8 КБ (близко к размеру файла .csv).Следовательно, после увеличения размера буфера byte [] до 8 000 000, он работал как шарм!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...