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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
| using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
//using System.Windows.Forms;
namespace FtpClient
{
public partial class MainWindow : Window
{
ContextMenu menu = new ContextMenu();
private string _Host;
//поле для хранения логина
private string _UserName;
//поле для хранения пароля
private string _Password;
//объект для запроса данных
FtpWebRequest ftpRequest;
//объект для получения данных
FtpWebResponse ftpResponse;
//флаг использования SSL
private bool _UseSSL = false;
//фтп-сервер
public string Host
{
get
{
return _Host;
}
set
{
_Host = value;
}
}
//логин
public string UserName
{
get
{
return _UserName;
}
set
{
_UserName = value;
}
}
//пароль
public string Password
{
get
{
return _Password;
}
set
{
_Password = value;
}
}
//Для установки SSL-чтобы данные нельзя было перехватить
public bool UseSSL
{
get
{
return _UseSSL;
}
set
{
_UseSSL = value;
}
}
string prevAdress = "ftp://";
public MainWindow()
{
InitializeComponent();
}
Client client;
private void btn_connect_Click_1(object sender, RoutedEventArgs e)
{
try
{
// Создаем объект подключения по FTP
client = new Client(prevAdress + txt_adres.Text, txt_login.Text, txt_password.Password);
_Host = txt_adres.Text;
_UserName = txt_login.Text;
_Password = txt_password.Password;
// Регулярное выражение, которое ищет информацию о папках и файлах
// в строке ответа от сервера
Regex regex = new Regex(@"^([d-])([rwxt-]{3}){3}\s+\d{1,}\s+.*?(\d{1,})\s+(\w+\s+\d{1,2}\s+(?:\d{4})?)(\d{1,2}:\d{2})?\s+(.+?)\s?$",
RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
// Получаем список корневых файлов и папок
// Используется LINQ to Objects и регулярные выражения
List<FileDirectoryInfo> list = client.ListDirectoryDetails()
.Select(s =>
{
Match match = regex.Match(s);
if (match.Length > 5)
{
// Устанавливаем тип, чтобы отличить файл от папки (используется также для установки рисунка)
string type = match.Groups[1].Value == "d" ? "folder.png" : "Documents.ico";//"Documents.ico"
// Размер задаем только для файлов, т.к. для папок возвращается
// размер ярлыка 4кб, а не самой папки
string size = "";
if (type == "Documents.ico")
size = (int.Parse(match.Groups[3].Value.Trim()) / 1024).ToString() + " кБ";
return new FileDirectoryInfo(size, type, match.Groups[6].Value, match.Groups[4].Value, txt_adres.Text);
}
else return new FileDirectoryInfo();
}).ToList();
// Добавить поле, которое будет возвращать пользователя на директорию выше
list.Add(new FileDirectoryInfo("", "home.ico", "...", "", txt_adres.Text));
list.Reverse();
// Отобразить список в ListView
lbx_files.DataContext = list;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString() + ": \n" + ex.Message);
}
}
private void folder_Click(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount >= 2)
{
FileDirectoryInfo fdi = (FileDirectoryInfo)(sender as StackPanel).DataContext;
if (fdi.Type == "folder.png")//1001 ДЕРЕКТОРИЯ
{
prevAdress = fdi.adress;
txt_adres.Text = fdi.adress + fdi.Name + "/";
btn_connect_Click_1(true, null);
}
}
}
FileDirectoryInfo file;
private void button_Click_1(object sender, RoutedEventArgs e)
{
file = (FileDirectoryInfo)(sender as StackPanel).DataContext;
string path = file.Name;
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://" + _Host + path);
ftpRequest.Credentials = new NetworkCredential(_UserName, _Password);
ftpRequest.EnableSsl = _UseSSL;
ftpRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
ftpResponse.Close();
/*lbx_files.Items.Remove(path);*///Кнопка удаления
}
private void lbx_files_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
string tempstr = lbx_files.Name;
lbx_files.Name = "";//это нужно только для "Cut"
ContextMenu menu = new ContextMenu();
menu.Items.Add("Сохранить файл");
//menu.Items[0].Click += new EventHandler(RemoveDirectory);
//// // menu.Items.Add("Загрузить файл на сервер");
//// // menu.Items[1].Click += new EventHandler(Upload_File);
menu.Items.Add("Удалить каталог");
//// //menu.Items[2].Click += new EventArgs(RemoveDirectory);
// menu.Items.Add("Удалить файл");
//// // menu.Items[3].Click += new EventHandler(Delete_File);
lbx_files.ContextMenu = menu;
}
private void button4_Click(object sender, RoutedEventArgs e)
{
}
public void DeleteFile(string path)
{
ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://" + _Host + path);
ftpRequest.Credentials = new NetworkCredential(_UserName, _Password);
ftpRequest.EnableSsl = _UseSSL;
ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
ftpResponse.Close();
}
//метод протокола FTP MKD для создания каталога на FTP-сервере
public void CreateDirectory(string path, string folderName)
{
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://" + _Host + path + folderName);
ftpRequest.Credentials = new NetworkCredential(_UserName, _Password);
ftpRequest.EnableSsl = _UseSSL;
ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
ftpResponse.Close();
}
//метод протокола FTP RMD для удаления каталога с FTP-сервера
public void RemoveDirectory(string path)
{
_Host = txt_adres.Text;
// string filename = path;
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://31.220.16.214/"+_Host + path);
ftpRequest.Credentials = new NetworkCredential(txt_login.Text, txt_password.Password);
ftpRequest.EnableSsl = _UseSSL;
ftpRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
ftpResponse.Close();
}
private void RemoveDirectory(object sender, RoutedEventArgs e)
{
if (lbx_files.SelectedItems == null)
{
MessageBox.Show("Выделите файл для удаления");
}
try
{
string directory = lbx_files.SelectedItems.ToString();
RemoveDirectory(directory);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (lbx_files.SelectedItems[0] == null)
{
MessageBox.Show("Выделите файл для удаления");
}
try
{
string directory = lbx_files.SelectedItems.ToString();
DeleteFile(directory);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void lbx_files_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
} |