Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2012, 13:53   #1
E_x
 
Аватар для E_x
 
Регистрация: 12.12.2012
Сообщений: 3
Восклицание Библиотека BytesRoad.Net.FTP.dll для работы с FTP: как реализовать докачку файла

Добрый день. Пишу программу, реализующую скачивание с фтп(суть - фтп клиент).Использую библиотеку стороннего разработчика - 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)

upd. разобрался с одним методом , но не смог настроить его работу.
public void GetFile(int timeout, string destPath, string path, long offset, long length) - тут основные параметры - куда сохранять файл, какой файл, сдвиг скачивания,размер файла... Передаю параметры - длина текущего файла(того,что уже есть) размер файла на сервер(этот параметр тоже получаю).. Итого по-сути должно работать так: первый запуск, из 5 МБ скачался 1 МБ, завершил работу, запустил в параметрах передается сдвиг - 1МБ, размер - 5 МБ. По идее должен начать качать со 2-го МБайта, он так и делает, только вместо того,чтобы дописывать к уже существующему файлу, он стирает его и начинает качать новый со "смещением", т.е. в конце загрузки файл получается меньше на размер сдвига.

Решение я постараюсь найти и выложить тут, т.к. очень популярный вопрос, а готовое решение многих порадует, надеюсь на вашу помощь.
Вложения
Тип файла: zip BytesRoad.Net.Ftp.zip (37.5 Кб, 24 просмотров)
E_x вне форума Ответить с цитированием
Старый 13.12.2012, 10:56   #2
E_x
 
Аватар для E_x
 
Регистрация: 12.12.2012
Сообщений: 3
Смущение

Так-с... Если кому будет это интересно, я разобрался, может конечно коряво все сделал, но главное работает.
PHP код:

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(ftpClientnum2text2);//получаем информацию о файле(его размер)
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(num2str "\\" text2text2num3itemsFromFtp);//качаем файл с сервера со сдвигом(num3-размер уже существующей части файла на диске,itemsFromFtp-размер файла на сервере)
    
}
    else 
//если файла вообще нет на диске, то запускается обычное скачивание
    
{         
     
ftpClient.GetFile(num2str "\\" text2text2);//получаем файл                                    
    
}
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) + "\\Папка\\" text2System.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-х форумах написал, в итоге сам разобрался) После долгих мучений
p.s.s. выделил php-тэгом,только для сохранения цветов..
E_x вне форума Ответить с цитированием
Старый 18.12.2012, 14:15   #3
E_x
 
Аватар для E_x
 
Регистрация: 12.12.2012
Сообщений: 3
По умолчанию

Я не успокоился на этом, на мысль навели и вот результат. Докачку осуществлять так:

PHP код:
FileStream file File.Open(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\папка\\" text2,FileMode.Open); //создаем поток,открывая файл для записи
file.Seek(num3,SeekOrigin.Begin);//указываем позицию,с которой начнется запись в файл(num3-сдвиг)
ftpClient.GetFile(num2filetext2num3itemsFromFtp);//функция докачки public void GetFile(int timeout, Stream userStream, string path, long offset, long length) 
file.Close();//обязательно закрываем поток! иначе файл все время будет занят,пока программу не "убьете" 
E_x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать дату создания файла на ftp Koder-KH Работа с сетью в Delphi 0 30.11.2011 18:11
Авторизация через FTP для открытия файла excel ru3000 Microsoft Office Excel 1 18.11.2011 05:30
Библиотека curl для написания FTP-клиента (автоапдейтер программы) ZVano C/C++ Сетевое программирование 5 02.03.2011 16:57
Есть ли библиотека для http, ftp запросов в С? rand8154 Qt и кроссплатформенное программирование С/С++ 1 15.12.2009 15:59
Минимальное приложение для загрузки файла на FTP Gambler Работа с сетью в Delphi 6 29.01.2008 22:58