как передать (загрузить / скачать) файл, в котором он остановлен из-за сбоя сети, он должен возобновить работу с последнего записанного байта - PullRequest
0 голосов
/ 16 сентября 2009

я делаю проекты в ftp и удаленном взаимодействии, я очень часто передаю файлы, при отправке файла, если сеть потерпела неудачу, программа должна ждать, пока соединение не будет возобновлено, и после возобновления она должна передать файл с места, где был записан последний байт. Как это сделать.

Итак, что мне делать, я проверю файл и получу его размер, вычтем его из общего размера и начну копировать из полученного размера. это будет работать

Ответы [ 4 ]

1 голос
/ 05 ноября 2009

Здесь есть библиотека C # с открытым исходным кодом здесь .

API утверждает, что метод Put «Разрешает добавление, если текущий файл существует». через логический параметр. Это, вероятно, то, что вы хотите. Все, что вам нужно сделать, это повторить загрузку, пока вы не получите успешное событие передачи.

1 голос
/ 16 сентября 2009

Это не решение C #, но Getright делает это очень хорошо.

Программно, для записи файлов, я бы подумал, что для возобновления передачи вам необходимо подключиться, прочитать файл (или каким-либо другим способом определить его размер), а затем открыть его и добавить оставшиеся данные , Возможно, стоит проверить, что последние N байтов в существующем файле соответствуют тем, которые находятся в вашем локальном файле. Чтение будет аналогичным - перейдите к определенной части файла и начните чтение обратно.

[Изменить] Если вам удалось установить FTP-соединение, вам нужна команда: REST :

RESTART (ОТДЫХ)

Поле аргумента представляет маркер сервера, с которого должна быть возобновлена ​​передача файла. Эта команда не вызывает передачу файла, но пропускает файл до указанной контрольной точки данных. Эта команда должна немедленно сопровождаться соответствующей командой службы FTP, которая должна возобновить передачу файла.

Я уверен, что есть несколько простых клиентских библиотек C # ftp , которые вы можете использовать, если вы еще не нашли / не написали одну.

1 голос
/ 16 сентября 2009

Вы должны использовать метод, подобный wget , который может возобновить прерванные передачи.

Является ли тег c # действительно обязательным требованием?

Извините, не могу помочь с c #

РЕДАКТИРОВАТЬ: и да, это правда, что сказал Джон.

Возобновленная передача не будет на самом деле начинаться со следующего байта. Там будет быстрая проверка, что предыдущая часть была правильно передана.

0 голосов
/ 18 сентября 2009
FileInfo finfo = new FileInfo("E:\\butterfly.mpg");
                FileInfo sourceinfo = new FileInfo("H:\\butterfly.mpg");
                int sourceLength = 0;
                sourceLength = (int)sourceinfo.Length;
                int totalLength = (int)finfo.Length;
                int RemaingDatalength = 0;
                RemaingDatalength = sourceLength - totalLength;
                int appLength = 0;
                int Remaining = 0;
                int bufferLength = 12488;
                byte[] buffer = new byte[bufferLength];
                int pointer = 1;
                FileStream fsa = new FileStream("E:\\butterfly.mpg", FileMode.Append);
                fss = new FileStream("H:\\butterfly.mpg", FileMode.Open);
                while (pointer != 0)
                {
                    fss.Position = (long)totalLength;
                    fss.Read(buffer, 0, bufferLength);
                    totalLength += bufferLength;
                    appLength += bufferLength;
                    fsa.Write(buffer, 0, bufferLength);
                    Remaining = RemaingDatalength - appLength;
                    if (Remaining < bufferLength)
                    {
                        byte[] buff = new byte[Remaining];
                        fss.Read(buff, 0, Remaining);
                        fsa.Write(buff, 0, Remaining);
                        break;
                    }
                }
                fss.Close();
                fsa.Close();
                MessageBox.Show("Filetransfer Completed");

это метод, который я использовал при отправке файла через remoting.now, я пытаюсь это сделать по FTP

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