С Новым годом! Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
3 / 3 / 4
Регистрация: 01.02.2013
Сообщений: 32

Зависает при попытке передачи второго файла

18.06.2013, 23:08. Показов 1296. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Первый файл программа закачивает отлично, при попытке передать второй зависает.

Pascal
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
50
procedure Upload (filename:string; folder:string;browser:string; name:string);
  begin
  var  reqFTP: ftpwebrequest;
  var uriftp: string := ('ftp://*.*.*.*');
  var fileinf: fileinfo;
  var buff: array  of byte;
  var contentLen: integer;
  var fs: filestream;
  var strm: stream;
  var responces: ftpwebresponse;
  var urina: string;
  var debug: string;             \\проверка статуса FTP
  var debugcontent:integer; \\оставшийся размер файла при его передаче (для удобной пошаговой компиляции)
 
  case
  checkfolder (folder,browser) of    \\есть ли папка
   false: createfolder (folder);        \\если нет - создаем
   else
  end;
  case
  checkbrowser (folder,browser) of        \\есть ли папка в первой папке
  false: createbrowser (folder,browser);  \\если нет - создаем
  else
  end;
  urina:= (uriftp+'/'+folder+'/'+browser+'/'+name);  \\ адрес записываемого файла
  fileinf := new fileinfo (filename);
  reqftp := (new FtpWebRequest(urina)) as FtpWebRequest;     
  reqFTP.Credentials := new NetworkCredential( 'USR' ,'PWD' );
  reqFTP.KeepAlive := false;
  reqFTP.Method := WebRequestMethods.Ftp.UploadFile;
  reqFTP.UseBinary := true;
  reqFTP.ContentLength := fileInf.Length;
  responces := reqFTP.GetResponse as FtpWebResponse;            \\ Зависает
  debug:= (responces.StatusCode.ToString+' '+responces.StatusDescription); \\статус FTP
  fs := fileInf.OpenRead;
  debug:=responces.StatusCode.ToString+' '+responces.StatusDescription; \\статус FTP
  strm := reqftp.GetRequestStream;
  SetLength(buff, 256);
  contentlen:= fs.Read (buff,0,256);
  debugcontent:= fileinf.Length;
  repeat
    contentlen:= fs.Read (buff,0,256);
    strm.Write (buff,0,contentlen);
    debugcontent:= (debugcontent-256);
  until contentLen =0;
  strm.Close;             \\Разрываем
  fs.Close;                 \\соединения
  reqftp.GetResponse;
  debug:= (responces.StatusCode.ToString+' '+responces.StatusDescription); \\статус FTP
  end;
У меня есть предположения, что соединение с сервером не разорвалось, поэтому не образуется новое.
Но подтверждений тому я не вижу.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.06.2013, 23:08
Ответы с готовыми решениями:

WebClient зависает при скачивании второго файла
Приветствую. Не могу понять в чем дело. Есть сайт с которого нужно скачать ставки риска (за последние пол года). Формируются они скриптом в...

Почему при попытке удаления файла с диска у меня зависает веб-сервер?
Почему при попытке удаления файла с диска у меня зависает веб-сервер? Вот код: set...

Ошибка преобразования типов при попытке передачи параметров в конструктор
В общем ситуация следующая есть некая основная форма, в которой объявлен пользовательский класс: namespace MyNamespace{ ref class...

5
38 / 37 / 23
Регистрация: 01.06.2009
Сообщений: 59
19.06.2013, 00:11
Цитата Сообщение от Rutori Посмотреть сообщение
Первый файл программа закачивает отлично
Неправда. Я тебе уже исправлял основной цикл, второй раз править не буду. Попробуй закачать файл размером меньше чем 256 байт - увидишь, в чем проблема.
1
3 / 3 / 4
Регистрация: 01.02.2013
Сообщений: 32
21.06.2013, 23:46  [ТС]
@volvo877, поставил размер буфера 2048, закачивал файл размером 1 кбайт. Все работает, второй файл не закачивает.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
22.06.2013, 00:58
Да не в этом проблема. У тебя:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
  SetLength(buff, 256);
  contentlen:= fs.Read (buff,0,256); // Прочел 256 байт?
  debugcontent:= fileinf.Length;
  repeat
    contentlen:= fs.Read (buff,0,256); // Сколько еще прочел?
 
    // Если размер файла равен всего 256, или меньше - то
    // contentlen = 0, и записано в файл ничего не будет.
    // Файл на FTP есть, но РАЗМЕР его нулевой !!!
    strm.Write (buff,0,contentlen);
    debugcontent:= (debugcontent-256);
  until contentLen =0;
Чуешь, в чем ошибка? И тебе на эту ошибку уже указывали. Ты ответов не читаешь?

А по поводу второго файла - добро пожаловать в мир, где правит GC (я про Garbage Collector), пока он не удалит твой экземпляр reqFTP - новый не создашь, старый использовать не сможешь. Перебрось KeepAlive в True - мне тогда 10 файлов запросто дает закачивать, больше просто не пробовал.
1
3 / 3 / 4
Регистрация: 01.02.2013
Сообщений: 32
22.06.2013, 01:07  [ТС]
@UI, благодарствую. про Garbage Collector я как-то не учел, простите ламера
0
3 / 3 / 4
Регистрация: 01.02.2013
Сообщений: 32
15.07.2013, 00:02  [ТС]
UI, Вот код весь. Я пробовал поиграться со значениями KeepAlive, но ничего путного не вышло. Как GC понимает, что надо удалять экземпляр FtpWebRequest?

Вот полный код программы, если что.

Кликните здесь для просмотра всего текста
Pascal
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
function checkfolder(fold: string; brow: string): boolean;
begin
  checkfolder := true;
  var reqFTPs: ftpwebrequest;
  var uriftp: string := ('ftp://ADR');
  var urinak: string;
  var respcheckfolder: ftpwebresponse;
  urinak := (uriftp + '/' + fold);
  reqftps := (new FtpWebRequest(urinak)) as ftpwebrequest;
  reqFTPs.Credentials := new NetworkCredential( 'USR', 'PWD' );
  reqFTPs.KeepAlive := false;
  reqFTPs.Method := WebRequestMethods.Ftp.ListDirectory;
  reqFTPs.usebinary := true;
  try
    respcheckfolder := reqFTPs.GetResponse as FtpWebResponse;
  except
    checkfolder := false;
  end;
end;
 
function checkbrowser(fold: string; brow: string): boolean;
begin
  var reqFTPs: ftpwebrequest;
  var uriftp: string := ('ftp://ADR');
  var urinak: string;
  var respcheckbrowser: ftpwebresponse;
  checkbrowser := true;
  urinak := (uriftp + '/' + fold + '/' + brow);
  reqftps := (new FtpWebRequest(urinak)) as ftpwebrequest;
  reqFTPs.Credentials := new NetworkCredential( 'USR', 'PWD' );
  reqFTPs.KeepAlive := false;
  reqFTPs.Method := WebRequestMethods.Ftp.ListDirectory;
  reqFTPs.usebinary := true;
  try
    respcheckbrowser := reqFTPs.GetResponse as FtpWebResponse;
  except
    checkbrowser := false;
  end;
  
end;
 
procedure createfolder(name: string);
begin
  var reqFTPs: ftpwebrequest;
  var uriftp: string := ('ftp://ADR');
  
  var urinak: string;
  var responsebrowser: ftpwebresponse;
  urinak := (uriftp + '/' + name);
  reqftps := (new FtpWebRequest(urinak)) as ftpwebrequest;
  reqFTPs.Credentials := new NetworkCredential( 'USR', 'PWD' );
  reqFTPs.KeepAlive := false;
  reqFTPs.Method := WebRequestMethods.Ftp.MakeDirectory;
  reqFTPs.usebinary := true;
  try
  responsebrowser := reqFTPs.GetResponse as FtpWebResponse;
  except
end;
end;
 
procedure createbrowser(name: string; browser: string);
begin
  var reqFTPs: ftpwebrequest;
  var uriftp: string := ('ftp://ADR');
  var fsq: filestream;
  var strmq: stream;
  var urinak: string;
  var responsebrowser : ftpwebresponse;
  urinak := (uriftp + '/' + name + '/' + browser);
  reqftps := (new FtpWebRequest(urinak)) as ftpwebrequest;
  reqFTPs.Credentials := new NetworkCredential( 'USR', 'PWD' );
  reqFTPs.KeepAlive := false;
  reqFTPs.Method := WebRequestMethods.Ftp.MakeDirectory;
  reqFTPs.usebinary := true;
  try 
  responsebrowser := reqFTPs.GetResponse as FtpWebResponse;
  except
end;
end;
 
procedure Upload(filename: string; folder: string; browser: string; name: string);
begin
  var  reqFTP: ftpwebrequest;
  var uriftp: string := ('ftp://ADR');
  var fileinf: fileinfo;
  var buff: array  of byte;
  var contentLen: integer;
  var fs: filestream;
  var strm: stream;
  var responces: ftpwebresponse;
  var urina: string;
  var debug: string;
  var debugcontent: integer;
  
  case
  checkfolder(folder, browser) of
    false: createfolder(folder);
  else
    
  end ;
  case
  checkbrowser(folder, browser) of
    false: createbrowser(folder, browser);
  else
    
  end ;
  urina := (uriftp + '/' + folder + '/' + browser + '/' + name);
  fileinf := new fileinfo(filename);
  reqftp := (new FtpWebRequest(urina)) as FtpWebRequest;
  reqFTP.Credentials := new NetworkCredential( 'USR', 'PWD' );
  reqFTP.KeepAlive := true;
  reqFTP.Method := WebRequestMethods.Ftp.UploadFile;
  reqFTP.UseBinary := true;
  reqFTP.ContentLength := fileInf.Length;
  try
  responces := reqFTP.GetResponse as FtpWebResponse;   //Виснет после закачки второго файла
  except
  end;
  debug := (responces.StatusCode.ToString + ' ' + responces.StatusDescription);
  fs := fileInf.OpenRead;
  debug := responces.StatusCode.ToString + ' ' + responces.StatusDescription;
  strm := reqftp.GetRequestStream;
  debugcontent := fileinf.Length;
  SetLength(buff, 2048);
  repeat
    contentlen := fs.Read(buff, 0, 2048);
    strm.Write(buff, 0, contentlen);
    debugcontent := (debugcontent - 2048);
  until contentLen = 0;
  strm.Close;
  fs.Close;
  reqftp.GetResponse;
  debug := (responces.StatusCode.ToString + ' ' + responces.StatusDescription);
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2013, 00:02
Помогаю со студенческими работами здесь

Ошибка компиляции при попытке передачи переменной ссылочного типа в качестве параметра
Вечер добрый, форумчане. Вопрос в виде комментария написан в коде: namespace TestConsole { class Program { ...

Проблема передачи переменных в сессии при попытке сохранить файл asp в формате excel
Кто-нибудь сталкивался с проблемой передачи переменных в сессии при попытке сохранить файл asp в формате excel? Я пытаюсь передать...

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

Зависает Server при попытке восстановления БД
Доброго времени суток, уважаемые форумчане! Столкнулся с зависанием при восстановлении БД. А именно на этом шаге...

Зависает при попытке сделать снимок экрана, при запуске программ, иногда во время сильной загрузки ЦП
При попытке сделать снимок экрана(нажатие на кнопку принт скрин), при запуске некоторых программ, иногда просто во время сильной загрузки...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru