Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
StafordDev
25 / 25 / 24
Регистрация: 08.07.2013
Сообщений: 117
1

Повторная загрузка файла на FTP-сервер без перезапуска программы

08.12.2016, 23:50. Просмотров 243. Ответов 7

Итак, суть в чем: в моей программе происходит загрузка файла на FTP-сервер. Код метода загрузки, признаюсь, не мой, но в исходной программе можно вызывать метод загрузки одного и того же файла сколько угодно раз, и каждый раз он будет загружаться (ну, разумеется, если соединение установлено). Переместив этот код в свою программу, я столкнулся с проблемой: при повторном вызове метода с теми же параметрами программа зависает на строке:
C#
1
Stream reqStream = request.GetRequestStream();
Метод загрузки (в другом статическом классе). Он вызывается из обработчика события нажатия кнопки в классе Main:
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
public static void uploadFile(string FTPAddress, string filePath, string username, string password)
        {
            try
            {
                //Create FTP request
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(FTPAddress + "/" + filePath);
 
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(username, password);
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = false;
 
                //Load the file
                FileStream stream = File.OpenRead(filePath);
                byte[] buffer = new byte[stream.Length];
 
                stream.Read(buffer, 0, buffer.Length);
                stream.Close();
 
                //Upload file
                Stream reqStream = request.GetRequestStream();
                reqStream.Write(buffer, 0, buffer.Length);
                reqStream.Close();
 
                MessageBox.Show("Uploaded Successfully");
                request.Abort();
            }
            catch (Exception e)
            {
                if (MessageBox.Show(string.Format("Ошибка: При загрузке расписания на сервер возникла ошибка '{0}', повторить загрузку?", e.Message), "SchedulerMini: сообщение об ошибке", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == DialogResult.Cancel)
                {
                    Application.Exit();
                }
                else
                    FTPTools.uploadFile([Повторно вызываем метод]);
            }
Я уже пробовал делать метод (и класс, в котором этот метод находится) не статическими, но это не изменило ничего. Голова уже под вечер не работает, поэтому решил спросить помощи здесь.
Исходный код, из которого был взят метод загрузки:
Кликните здесь для просмотра всего текста
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
 
namespace FTPUploader
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void uploadFile(string FTPAddress, string filePath, string username, string password)
        {
            //Create FTP request
            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(FTPAddress + "/" + Path.GetFileName(filePath));
 
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(username, password);
            request.UsePassive = true;
            request.UseBinary = true;
            request.KeepAlive = false;
 
            //Load the file
            FileStream stream = File.OpenRead(filePath);
            byte[] buffer = new byte[stream.Length];
 
            stream.Read(buffer, 0, buffer.Length);
            stream.Close();
 
            //Upload file
            Stream reqStream = request.GetRequestStream();
            reqStream.Write(buffer, 0, buffer.Length);
            reqStream.Close();
 
            MessageBox.Show("Uploaded Successfully");
        }
 
        private void btnUpload_Click(object sender, EventArgs e)
        {
            btnUpload.Enabled = false;
            Application.DoEvents();
 
            uploadFile(txtFTPAddress.Text, txtFilePath.Text, txtUsername.Text, txtPassword.Text);
            btnUpload.Enabled = true;
        }
 
        private void txtFTPAddress_Leave(object sender, EventArgs e)
        {
            if (!txtFTPAddress.Text.StartsWith("ftp://"))
                txtFTPAddress.Text = "ftp://" + txtFTPAddress.Text;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (openFile1.ShowDialog() == DialogResult.OK)
                txtFilePath.Text = openFile1.FileName;
        }
 
        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start("http://vcskicks.com/");
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2016, 23:50
Ответы с готовыми решениями:

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

Подгрузка скриптов без перезапуска программы.
Я занимаюсь irc ботом на c#, пишу для него скрипты, но они находятся...

Загрузка файла с FTP сервера
Всем привет.Подскажите пожалуйста как реализовать скачивание файла с...

Загрузка файла на FTP через php
Здравствуйте, существует следующая проблема, при написании программы на c#...

Загрузка файла с FTP с отображением прогресса
Всем привет. Задача: Есть форма. На ней два элемента - прогресс бар и...

7
StafordDev
25 / 25 / 24
Регистрация: 08.07.2013
Сообщений: 117
10.12.2016, 01:52  [ТС] 2
Пробовал вызывать метод Dispose у потоков, пробовал запускать сборщик мусора (GC.Collect()) в конце выполнения метода - все бесполезно.
0
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
11.12.2016, 08:49 3
Цитата Сообщение от StafordDev Посмотреть сообщение
все бесполезно.
Обратите внимание на строку 27 исходного кода (не вашего). В вашем коде такого вызова нет.
1
StafordDev
25 / 25 / 24
Регистрация: 08.07.2013
Сообщений: 117
11.12.2016, 12:17  [ТС] 4
27 строка исходного кода:
Цитата Сообщение от StafordDev Посмотреть сообщение
request.UsePassive = true;
В моем коде эта строка под номером 10.
0
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
11.12.2016, 12:58 5
Цитата Сообщение от StafordDev Посмотреть сообщение
27 строка исходного кода:
Извиняюсь за нескромный вопрос, вам к окулисту не нужно?
27 строка исходного кода (первого по списку): request.Abort();
Во втором коде такого вызова нет. На это вы не обратили внимание?
1
StafordDev
25 / 25 / 24
Регистрация: 08.07.2013
Сообщений: 117
11.12.2016, 19:38  [ТС] 6
Цитата Сообщение от insite2012 Посмотреть сообщение
Извиняюсь за нескромный вопрос, вам к окулисту не нужно?
И Вы меня, конечно, извините, но Вы сами указали мне смотреть на 27 строчку исходного (не моего) кода:
Цитата Сообщение от insite2012 Посмотреть сообщение
на строку 27 исходного кода (не вашего)
Хотя тут, наверное, виноват я сам: не слишком явно указал на то, что первый код - мой, а второй - не мой.
По поводу этой строки: что с ней, что без нее - результат один.

P.S. Я уже подумывал над тем, чтобы подключить рабочий код отдельным модулем к программе, создавать экземпляр второй формы и программно нажимать на кнопку btnUpload.PerformClick(), но костыли - это костыли, и делать нужно без них.
0
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
11.12.2016, 20:12 7
Цитата Сообщение от StafordDev Посмотреть сообщение
но костыли - это костыли, и делать нужно без них.
Согласен.
Код ниже грузит файл сколько угодно раз. Проверено.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
 
namespace FtpUploaderDemo {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            uploadButton.Click += new EventHandler(uploadButton_Click);
        }
 
        void uploadButton_Click(object sender, EventArgs e) {
            using (OpenFileDialog dialog = new OpenFileDialog()) {
                dialog.FileName = "";
                if (dialog.ShowDialog() == DialogResult.OK) {
                    byte[] data = File.ReadAllBytes(dialog.FileName);
                    var address = string.Format("ftp://{0}/{1}", "тут_адрес_хоста", "тут_имя_файла_для_сохранения");
                    FtpUploader.UploadFile(address, "", "", data);
                }
            }
        }
    }
    public class FtpUploader {
        public static void UploadFile(string address, string username, string password, byte[] data) {
            try {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(address);
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(username, password);
                request.UseBinary = true;
                request.KeepAlive = true;
 
                using (Stream stream = request.GetRequestStream()) {
                    stream.Write(data, 0, data.Length);
                }
                MessageBox.Show("Upload success!");
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
    }
}
1
StafordDev
25 / 25 / 24
Регистрация: 08.07.2013
Сообщений: 117
12.12.2016, 13:33  [ТС] 8
insite2012, код работает в свежесозданном проекте, но отказывается работать в старом, причем зависает снова на той же строке. Я уже даже и не знаю, что предположить.
Но мною был замечен интереснейший феномен. Если создать новую кнопку, и в ее обработчик вписать вызов функции, то при нажатии на эту кнопку никаких багов не будет, и файл будет загружаться сколько угодно раз.
0
12.12.2016, 13:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2016, 13:33

Загрузка файла Excel в DataGridView по FTP
Как реализовать загрузку таблицы файла xls по FTP в таблицу DataGridView? Если...

Загрузка файла на сервер
Доброго времени суток. Необходима любая информация (в идеале кусок кода)...

Загрузка файла на сервер vk
Добрый день Подскажите через какие функции можно загрузить определённый файл...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru