чтение и запись большого размера файла c # - PullRequest
0 голосов
/ 18 января 2012

я пишу приложение для передачи файлов, чтобы отправлять и получать большие данные, такие как 1 ГБ ... но я думаю, что когда я читаю данные из файла и заполняю их в байтовый массив, который хранится в ОЗУ, и это будет влиять на компьютерскорость .. если я сделаю как:

(loop till end of the file)
{
   read 128 MB from the file into byte array
   (loop till end of 128)
   {
       send 1 kb to server
   }
   byte array = null
}

если это правильно .. что лучше сделать !!beginSend и beginReceive для отправки большого файла или просто цикл для отправки файла

Я был бы рад, если вы научите меня с некоторым кодом заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

даже 128 МБ не очень хороший способ .. лучше прочитать небольшой буфер ... затем отправить его прямо на другую сторону

проверить это.

после отправки fileName и fileSize на другую сторону

это должно быть распространено в (сервер / клиент)

FileStream fs;
NetworkStream network;
int packetSize = 1024*8;

Способ отправки

public void Send(string srcPath, string destPath)
    {
        byte data;
        string dest = Path.Combine(destPath, Path.GetFileName(srcPath));
        using (fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read))
        {
            try
            {
                long fileSize = fs.Length;
                long sum = 0;
                int count = 0;
                data = new byte[packetSize];
                while (sum < fileSize)
                {
                    count = fs.Read(data, 0, packetSize);
                    network.Write(data, 0, count);
                    sum += count;
                }
                network.Flush();
            }
            finally
            {
                fs.Dispose();
                data = null;
            }
        }
    }

Способ получения:

    public void Receive(string destPath, long fileSize)
    {
        byte data;
        using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write))
        {
            try
            {
                int count = 0;
                long sum = 0;
                data = new byte[packetSize];
                while (sum < fileSize)
                {
                    count = network.Read(data, 0, packetSize);
                    fs.Write(data, 0, count);
                    sum += count;
                }
            }
            finally
            {
                fs.Dispose();
                data = null;
            }
        }
    }
0 голосов
/ 18 января 2012

Windows начнет вести себя странно, если вы [начнете] отправить больше, чем ок. 1 МБ за один раз. Это отличается между версиями Windows, сетевыми драйверами, размером обуви пользователя и фазой луны. Ниже 1 МБ у вас должно быть все в порядке.

Итак, либо

(loop till end of the file)
{
   read 128 MB from the file into byte array
   (loop till end of 128)
   {
       send 1 MB to server
   }
   byte array = null
}

или, если это действительно файл

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