Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
StafordDev
25 / 25 / 14
Регистрация: 08.07.2013
Сообщений: 113
#1

Повторная загрузка файла на FTP-сервер без перезапуска программы - C#/.NET 4.x

08.12.2016, 23:50. Просмотров 220. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос .NET 4.x Повторная загрузка файла на FTP-сервер без перезапуска программы (C#):

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

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

Загрузка файла с FTP сервера - C#
Всем привет.Подскажите пожалуйста как реализовать скачивание файла с FTP-сервера (FTP сайта)? Нужно задать логин,пароль,порт и место куда...

Загрузка файла Excel в DataGridView по FTP - C#
Как реализовать загрузку таблицы файла xls по FTP в таблицу DataGridView? Если чтение файла через OFD еще можно реализовать,но как это...

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

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

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

P.S. Я уже подумывал над тем, чтобы подключить рабочий код отдельным модулем к программе, создавать экземпляр второй формы и программно нажимать на кнопку btnUpload.PerformClick(), но костыли - это костыли, и делать нужно без них.
0
insite2012
Модератор
Эксперт .NET
4769 / 3728 / 902
Регистрация: 12.10.2013
Сообщений: 10,938
Записей в блоге: 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 / 14
Регистрация: 08.07.2013
Сообщений: 113
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
Привет! Вот еще темы с ответами:

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

Загрузка файла на сервер с использованием BackgroundWorker - отображение прогресса - C#
Добрый вечер! Знаю, подобных тем полно, но ответ на свой вопрос я так и не нашел. Я через протокол SFTP заливаю выбранный файл....

.NET 4.x Локализация без перезапуска формы - C#
Добрый вечер. Делаю приложение на windows forms (.NET Framework 4.6). Нужно сделать локализацию.В зависимости от выбранного языка,подключаю...

Обновить данные на форме без ее перезапуска - C#
Здравствуйте, подскажите как сделать кнопку обновить на форме ( имеется в виду перегрузка всех ее компонентов ).


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

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

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