2. Truyền File
2.7. Một vài công cụ thực tế của FTP
ITC có một vài hạn chế, có khá một vài lỗi nổi tiếng, và là xa là một việc
thực hiện hiệu suất cao. Hơn nữa, nó là không có nguồn gốc NET, và nhiều nhà phần mềm sẽ yêu cầu một NET dự án là mã quản lý 100%.
Bằng cách làm theo các mã trên các trang tiếp theo, bạn sẽ có đầy đủ FTP client, với khả năng để duyệt một hệ thống tập tin từ xa, tải lên, và
tải về Bắt đầu một dự án mới trong Visual Studio. NET và thêm hai hình thức,
frmLogon và frmMain. Về hình thức Logon, rút ra bốn hộp văn bản: tbServer, tbUsername, tbPassword, và tbStatus. Sau đó nên được thiết lập với = multiline
đúng sự thật và màu xám ra ngoài một cách thích hợp. Một nút, btnLogon, cũng
nên được thêm vào Trên các hình thức chính, vẽ hai danh sách hộp:. LbFiles và lbFolders. Thêm một hộp văn bảntên là tbStatus trong phong cách tương tự như
trong các hình thức Logon. Thêm ba nút: btnUpload, btnDownload, và btnRoot. Ngoài ra thêm một hộp thoại File Open kiểm soát tên là OpenFileDialog và Save File Dialog kiểm soát đặt tên là SaveFileDialog.
Trong Form chính, thêm một vài biến toàn cục:
private const string STR_Constant = "\r\n"; public frmLogon LogonForm = new frmLogon(); public NetworkStream NetStrm;
public string RemotePath = ""; public string server = "";
public string sendFTPcmd(string cmd) {
byte[] szData;
string returnedData = "";
StreamReader RdStrm = new StreamReader(NetStrm); szData = Encoding.ASCII.GetBytes(cmd.ToCharArray()); NetStrm.Write(szData, 0, szData.Length); tbStatus.Text += "\r\nSent:" + cmd; returnedData = RdStrm.ReadLine(); tbStatus.Text += "\r\nRcvd:" + returnedData; return returnedData; }
public void getRemoteFolders() { string[] filesAndFolders; string fileOrFolder; string folderList = ""; int lastSpace = 0; folderList =
Encoding.ASCII.GetString(sendPassiveFTPcmd("LIST\r\n")); lbFiles.Items.Clear();
lbFolders.Items.Clear();
filesAndFolders = folderList.Split("\n".ToCharArray()); for (int i = 0; i < filesAndFolders.GetUpperBound(0); i++) {
if (filesAndFolders[i].StartsWith("-") || filesAndFolders[i].StartsWith("d")) {
lastSpace = 59; // UNIX format }
else {
lastSpace = 39; // DOS format } fileOrFolder = filesAndFolders[i].Substring(lastSpace); if (fileOrFolder.IndexOf(".") != -1) { lbFiles.Items.Add(fileOrFolder.Trim()); } else { lbFolders.Items.Add(fileOrFolder.Trim()); } } }
public byte[] sendPassiveFTPcmd(string cmd) {
byte[] szData;
System.Collections.ArrayList al = new ArrayList(); byte[] RecvBytes = new byte[Byte.MaxValue]; Int32 bytes;
Int32 totalLength = 0; szData =
System.Text.Encoding.ASCII.GetBytes(cmd.ToCharArray()); NetworkStream passiveConnection;
passiveConnection = createPassiveConnection(); tbStatus.Text += "\r\nSent:" + cmd;
StreamReader commandStream = new StreamReader(NetStrm); NetStrm.Write(szData, 0, szData.Length);
while (true) {
0, RecvBytes.Length); if (bytes <= 0) break; totalLength += bytes; al.AddRange(RecvBytes); } al = al.GetRange(0, totalLength); tbStatus.Text += "\r\nRcvd:" + commandStream.ReadLine(); // 125 tbStatus.Text += "\r\nRcvd:" + commandStream.ReadLine(); // 226 return (byte[])al.ToArray((new byte()).GetType());
}
private NetworkStream createPassiveConnection() { string[] commaSeperatedValues; int highByte = 0; int lowByte = 0; int passivePort = 0; string response = ""; TcpClient clientSocket;
NetworkStream pasvStrm = null; response = sendFTPcmd("PASV\r\n");
// 227 Entering Passive Mode (127,0,0,1,4,147).
commaSeperatedValues = response.Split(",".ToCharArray()); highByte = Convert.ToInt16(commaSeperatedValues[4]) * 256; commaSeperatedValues[5] =
commaSeperatedValues[5].Substring(0, commaSeperatedValues[5].IndexOf(")"));
lowByte = Convert.ToInt16(commaSeperatedValues[5]); passivePort = lowByte + highByte;
clientSocket = new TcpClient(server, passivePort);//TcpClient pasvStrm = clientSocket.GetStream();//NetworkStream return pasvStrm;
}
private void lbFolders_SelectedIndexChanged(object sender, EventArgs e) {
RemotePath += "/" + lbFolders.SelectedItem.ToString(); sendFTPcmd("CWD /" + RemotePath + STR_Constant); getRemoteFolders();
}
private void btnRoot_Click(object sender, EventArgs e) {
RemotePath = "/";
sendFTPcmd("CWD /\r\n"); getRemoteFolders();
}
private void btnUpload_Click(object sender, EventArgs e) {
openFileDialog.ShowDialog(); NetworkStream passiveConnection;
FileInfo fileParse = new FileInfo(openFileDialog.FileName); FileStream fs = new
FileStream(openFileDialog.FileName, FileMode.Open); byte[] fileData = new byte[fs.Length];
fs.Read(fileData, 0, (int)fs.Length);
passiveConnection = createPassiveConnection(); string cmd = "STOR " + fileParse.Name + "\r\n"; tbStatus.Text += "\r\nSent:" + cmd;
string response = sendFTPcmd(cmd); tbStatus.Text += "\r\nRcvd:" + response;
passiveConnection.Write(fileData, 0, (int)fs.Length); passiveConnection.Close();
MessageBox.Show("Uploaded"); tbStatus.Text += "\r\nRcvd:" + new
StreamReader(NetStrm).ReadLine(); getRemoteFolders(); }
private void btnDownload_Click(object sender, EventArgs e) {
byte[] fileData;
saveFileDialog.ShowDialog(); fileData = sendPassiveFTPcmd(
"RETR " + lbFiles.SelectedItem.ToString() + "\r\n"); FileStream fs = new FileStream(
saveFileDialog.FileName, FileMode.CreateNew); fs.Write(fileData, 0, fileData.Length);
fs.Close();
MessageBox.Show("Downloaded"); }