С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/58: Рейтинг темы: голосов - 58, средняя оценка - 4.90
 Аватар для E_x
63 / 63 / 0
Регистрация: 07.10.2012
Сообщений: 165

Библиотека BytesRoad.Net.FTP.dll для работы с FTP: как реализовать докачку файла

11.12.2012, 11:15. Показов 10865. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Пишу программу, реализующую скачивание с фтп(суть - фтп клиент).Использую библиотеку стороннего разработчика - BytesRoad.Net.FTP.dll . Собственно все работает отлично,с библиотекой,точнее ее основными функциями разобрался, но возникла необходимость в реализации докачки файлов с сервера, той функцией,которой я пользуюсь - не получается это реализовать(файл скачивается с начала). У этой функции есть несколько разных вариантов(с разными параметрами),в одном из таких вариантов я нашел параметр offset(сдвиг),и подумал,что это оно и есть, но разобраться не смог. Я уверен,что в этой библиотеке есть докачка, но как ее использовать - не пойму, объясните нубу пожалуйста..
Прибегнуть к FTPWebRequest - последний выход,если не получится разобраться с этой библиотекой.
p.s. библиотеку прикладываю к сообщению. Надеюсь на вашу помощь. Разработка ведется в VS c# Express 2010. Тип приложения - WPF.

Вот список вариантов функции GetFile:
public byte[ ] GetFile(int timeout, string path)
public byte[ ] GetFile(int timeout, string path, long offset, long length)
public void GetFile(int timeout, string destPath, string path) - - этот метод использую сейчас
public void GetFile(int timeout, string destPath, string path, long offset, long length)
public void GetFile(int timeout, unknown-type userStream, string path)
public void GetFile(int timeout, unknown-type userStream, string path, long offset, long length)
Вложения
Тип файла: zip BytesRoad.Net.Ftp.zip (37.5 Кб, 231 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2012, 11:15
Ответы с готовыми решениями:

Реализовать RETR команду для FTP клиента
В общем то я примерно представляю как реализовать, но наткнулся на проблему и ума не приложу как лучше сделать. Проблема: нужно забрать...

В папку лежащую на ftp сервере мне нужно загрузить изображение. Как реализовать?
Здравствуйте. Вопрос таков- у меня есть ссылка на картинку, к примеру вот http://cs540103.vk.me/c7008/v7008715/1efef/y0BWlsN2FFw.jpg и мне...

Отказанно в доступе для сохранения файла с FTP-сервера
Пишу клиент к ФТП серверу Вожусь с Либом фтп клиента от ByteRoadFtpExample. Там есть функция getFile() Вот как я реализовал свою...

6
 Аватар для E_x
63 / 63 / 0
Регистрация: 07.10.2012
Сообщений: 165
11.12.2012, 12:35  [ТС]
upd. разобрался с одним методом , но не смог настроить его работу.
public void GetFile(int timeout, string destPath, string path, long offset, long length) - тут основные параметры - куда сохранять файл, какой файл, сдвиг скачивания,размер файла... Передаю параметры - длина текущего файла(того,что уже есть) размер файла на сервер(этот параметр тоже получаю).. Итого по-сути должно работать так: первый запуск, из 5 МБ скачался 1 МБ, завершил работу, запустил в параметрах передается сдвиг - 1МБ, размер - 5 МБ. По идее должен начать качать со 2-го МБайта, он так и делает, только вместо того,чтобы дописывать к уже существующему файлу, он стирает его и начинает качать новый со "смещением", т.е. в конце загрузки файл получается меньше на размер сдвига.

p.s. по какой-то причине первое сообщение редактировать нельзя.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
11.12.2012, 12:47
Посмотрите другие методы - вам нужен AppendToFile.
1
 Аватар для E_x
63 / 63 / 0
Регистрация: 07.10.2012
Сообщений: 165
12.12.2012, 09:32  [ТС]
Метод AppendToFile есть:
public void AppendToFile(int timeout, string path, byte[ ] data)
public void AppendToFile(int timeout, string path, byte[ ] data, long offset, long length)
public void AppendToFile(int timeout, string path, string srcPath)
public void AppendToFile(int timeout, string path, string srcPath, long offset, long length)
public void AppendToFile(int timeout, string path, unknown-type userStream)
public void AppendToFile(int timeout, string path, unknown-type userStream, long offset, long length)

Пытаюсь работать здесь с аналогичным методом(который со сдвигом),но все время выходит на исключение.. Попытка выполнить не удается.

Добавлено через 18 часов 33 минуты
Насколько правильно я понял - этот метод должен дописывать в файл, но я не понял, скачивает ли он сам, или ему нужны разные части одного файла,чтобы объединить их.
Использую этот вариант public void AppendToFile(int timeout, string path, string srcPath, long offset, long length),здесь как я понял параметры следующие - srcPath-путь к файлу на диске, offset-сдвиг,length-размер файла на сервере. При попытке указать параметры типа(таймаут, имя файла, путь к файлу в папке,размер файла на диске(это по-сути и есть сдвиг),размер файла на сервере) - вылетает на исключение с ошибкой: "Операция не удалась".
0
 Аватар для E_x
63 / 63 / 0
Регистрация: 07.10.2012
Сообщений: 165
13.12.2012, 10:50  [ТС]
Так-с... Если кому будет это интересно, я разобрался, может конечно коряво все сделал, но главное работает.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
if (File.Exists(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2)) // проверяем есть ли в папке файл с таким именем
{
  FileInfo fileInfo = new FileInfo(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2);//если есть, то получаем его размер
  num3 = fileInfo.Length;//получаем размер файла
}
else
{
 num3 = 0L;
}
try
{
WriteLog("Попытка скачивания файла с сервера");
string str = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка"; //путь, откуда запускается программа, туда файл скачивается
long itemsFromFtp2 = this.GetItemsFromFtp(ftpClient, num2, text2);//получаем информацию о файле(его размер)
if (itemsFromFtp2 != 0) //если размер файла на сервере не равен 0, то будем качать его
{
    this.progressBar1.Value = 0;//ставим начальное значение прогрессбара
    this.progressBar1.Maximum = (int)itemsFromFtp2;//ставим максимальный размер файла  
    if (File.Exists(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2) && num3 < itemsFromFtp) //если файл уже есть и его размер меньше размера на сервере, то 
    {
      File.Move(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2,System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2 + ".tmp");//переименовываем файл в .tmp (просто добавляем в конец имени)
      ftpClient.GetFile(num2, str + "\\" + text2, text2, num3, itemsFromFtp);//качаем файл с сервера со сдвигом(num3-размер уже существующей части файла на диске,itemsFromFtp-размер файла на сервере)
    }
    else //если файла вообще нет на диске, то запускается обычное скачивание
    {         
     ftpClient.GetFile(num2, str + "\\" + text2, text2);//получаем файл                                    
    }
ftpClient.Disconnect(num2);//отключаемся от клиента
}
else //если размер файла равен 0 или его нет, то делаем запись в лог-файл и выводим всплывающее сообщение
{
  WriteLog("Файла " + text2 + " нет на сервере!");
  this.SetBalloonTip("Файла " + text2 + " нет на сервере!");
}
}
catch (Exception e)//если не получается скачать выводит ошибку,запись в лог-файл
{
  WriteLog("{0} Exception caught." + e);
  this.SetBalloonTip("Ошибка скачивания файла!");
}
finally //в любом случае после исполнения попытки делаем следующие вещи
{
  byte[] dat = System.IO.File.ReadAllBytes(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2); //в массив байт считываем только что скаченный кусок файла
  byte[] dat1 = System.IO.File.ReadAllBytes(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2 + ".tmp");  //в массив байт считываем уже существующий кусок файла
  File.Move(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2, System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2 + ".tmp2"); // переименовываем файл(в принципе можно сразу удалить,не делая лишних действий)
  byte[] final = dat1.Concat(dat).ToArray(); //создаем еще один массив, в котором объединяем 2 предыдущих                                System.IO.File.WriteAllBytes(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2, final);//сохраняем массив байт в файл
  File.Delete(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2 + ".tmp");//удаляем временные файлы, которые являются частями
  File.Delete(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Папка\\" + text2 + ".tmp2");//удаляем временные файлы, которые являются частями
}
p.s. надеюсь поможет кому-нибудь... На 3-х форумах написал, в итоге сам разобрался) После долгих мучений
1
 Аватар для E_x
63 / 63 / 0
Регистрация: 07.10.2012
Сообщений: 165
18.12.2012, 14:10  [ТС]
Я не успокоился на этом, на мысль навели и вот результат. Докачку осуществлять так:

C#
1
2
3
4
FileStream file = File.Open(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\папка\\" + text2,FileMode.Open); //создаем поток,открывая файл для записи
file.Seek(num3,SeekOrigin.Begin);//указываем позицию,с которой начнется запись в файл(num3-сдвиг)
ftpClient.GetFile(num2, file, text2, num3, itemsFromFtp);//функция докачки public void GetFile(int timeout, Stream userStream, string path, long offset, long length) 
file.Close();//обязательно закрываем поток! иначе файл все время будет занят,пока программу не "убьете"
1
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 2
10.06.2016, 21:12
у меня возникла маленькая проблема при скачивании файла с помощью bytesroad можешь помочь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.06.2016, 21:12
Помогаю со студенческими работами здесь

Как проверить существование файла на FTP сервере?
Как проверить существование файла на FTP сервере, т.е. если файл существует выполняется одно событие, если нет другое?

Библиотека для работы с FTP
Есть ли какая-нибудь удобная, желательно, хорошо документированная библиотека для работы с FTP? Открытость необязательна, предпочтение...

Какая есть библиотека для работы с ftp?
есть ли какая либо библиотека для работы с ftp? &lt;ftp.h&gt; -?если нет то где можно скачать? Программирую на С++ в КОНСОЛИ. Программа под...

Подключение org.apache.commons.net.ftp.FTP
В Java совсем новичок, но есть задача переписать ftp-клиент с C# на Java. Подскажите пожалуйста (желательно по пунктам), что как подключить...

Как реализовать отправку файла на FTP-сервер?
В общем ребят такая проблема. Я хочу чтоб некоторые файлы которые мне нужны это 1 файл( ID.exe) Отправился мне на FTP .ps У меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru