4.1 软件总体分析与设计
根据需求分析,按照系统开发的基本观点对功能进行分解,从功能上可对模块作如下划分:
1.连接管理模块:主要完成主机与服务器之间的连接与关闭操作。
2.文件管理模块:主要完成文件的显示、新建文件、删除文件等。
3.文件传输模块:主要完成主机与服务器连接成功以后文件的上传与下载。
4.辅助功能模块:主要是保存一些登录信息和一些简单的配置信息。
4.3 模块的程序实现
4.3.1 连接管理的程序实现
在用户打开软件后进入主窗体(MFFTP.cs),在连接服务器输入框中输入IP地址、用户名及密码后。先发送IP地址和端口号到服务器,然后对其应答分析,如果应答码为220表示对新用户服务准备好,继续发送用户名返回应答码331表示用户名正确需要口令。最后发送密码直到返回应答码230表示用户登录成功。其主要代码程序如下:
public void Connect()
{
socketControl = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
// 链接
try
{
socketControl.Connect(ep);
}
catch(Exception)
{
throw new IOException("Couldn't connect to remote server");
}
// 获取应答码
ReadReply();
if(iReplyCode != 220)
{
DisConnect();
throw new IOException(strReply.Substring(4));
}
// 登录
SendCommand("USER "+strRemoteUser);
if( !(iReplyCode == 331 || iReplyCode == 230) )
{
CloseSocketConnect();//关闭连接
throw new IOException(strReply.Substring(4));
}
if( iReplyCode != 230 )
{
SendCommand("PASS "+strRemotePass);
if( !(iReplyCode == 230 || iReplyCode == 202) )
{
CloseSocketConnect();//关闭连接
throw new IOException(strReply.Substring(4));
}
}
bConnected = true;
// 切换到目录
ChDir(strRemotePath);
}
4.3.2 文件管理的程序实现
对文件的管理有新建、删除、及属性设置。这里只对文件夹的删除操作做介绍,先实例化DirectoryInfo类并传入参数path,然后判断是文件还是文件夹用Delete()方法来删除文件。其主要代码程序如下:
private void MyDeleteFile(string path)
{//删除本地文件
try
{
if(path==null)
return;
DirectoryInfo MyDir=new DirectoryInfo(path);
if(MessageBox.Show(“是否删除文件夹:”+path+“及其所有内容?”,“提示信息”,MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes)
{
MyDir.Delete(true);
}
else if(MessageBox.Show("是否删除文件:"+path+"及其所有内容?","提示信息",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes)
{
FileInfo fi=new FileInfo(path);
fi.Delete();
}
}
catch
{
MessageBox.Show("该文件不存在","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
4.3.3 文件传输的程序实现
先进行判断是否与主机连接成功,获取要下载的文件名、保存到本机的路径、保存到本机时的文件名。在进行设置传输模式:二进制Binary传输或ACSII传输,在创建数据连接发送PASV被动模式进行传输然后对应答命令进行判断。最后进行数据传输以流方式传输。其主要代码程序如下:
public void Get(string strRemoteFileName,string strFolder,string strLocalFileName)
{
if(!bConnected)
{
Connect();
}
SetTransferType(TransferType.Binary);
if (strLocalFileName.Equals(""))
{
strLocalFileName = strRemoteFileName;
}
if(!File.Exists(strLocalFileName))
{
Stream st = File.Create(strLocalFileName);
st.Close();
}
FileStream output = new
FileStream(strFolder + "\\" + strLocalFileName,FileMode.Create);
Socket socketData = CreateDataSocket();
SendCommand("RETR " + strRemoteFileName);
if(!(iReplyCode == 150 || iReplyCode == 125
|| iReplyCode == 226 || iReplyCode == 250))
{
throw new IOException(strReply.Substring(4));
}
while(true)
{
int iBytes = socketData.Receive(buffer, buffer.Length, 0);
output.Write(buffer,0,iBytes);
if(iBytes <= 0)
{
break;
}
}
output.Close();
if (socketData.Connected)
{
socketData.Close();
}
if(!(iReplyCode == 226 || iReplyCode == 250))
{
ReadReply();
if(!(iReplyCode == 226 || iReplyCode == 250))
{
throw new IOException(strReply.Substring(4));
}
}
}
4.3.4 辅助功能的程序实现
当需要返回上级目录时,先检查当前目录字符串是否小于3,如果小于了3则表示已经是跟目录了,不能在返回上级目录了。其他情况直接用Substring来去掉最后一个目录。具体办法是每次取字符串从0到最后一个“\”。然后把该字符串赋值给ComboBox。程序代码如下:其主要代码程序如下:
private void but_Fa_Click(object sender, System.EventArgs e)
{//返回上级目录
string path=this.comboBox1.Text;
string newpath;
if(path.EndsWith("\\"))
{
if(path.Length<=3)
{
MessageBox.Show("根目录了!","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
return;
}
newpath=path.Substring(0,path.LastIndexOf("\\"));
this.comboBox1.Text=newpath.Substring(0,newpath.LastIndexOf("\\"));
}
else
{
if(path.LastIndexOf("\\")!=2)
{
newpath=path.Substring(0,path.LastIndexOf("\\"));
this.comboBox1.Text=newpath;
}
else
{
newpath=path.Substring(0,path.LastIndexOf("\\")+1);
this.comboBox1.Text=newpath;
return;
}
}
}
当在第一次登录主机时,为方便以后在次登录该主机则需要保存其登录信息。先把所有的输入框中的值赋给有代表意思的字符串。如果主机别名为空则主机别名与主机地址相同。
然后通过IniWriteValue方法来写入mfftp.ini文件中,其主要代码程序如下:
private void but_Ok_Click(object sender, System.EventArgs e)
{//添加登录主机信息
string hostname=this.text_Name.Text.Trim();
string hostip=this.text_SerIp.Text.Trim();
string loginname=this.loginName.Text.Trim();
string loginpwd=this.login_Pwd.Text.Trim();
string mydir=this.text_add.Text.Trim();
if(hostname=="")
{
hostname=hostip;
}
IniFile inf=new IniFile();
inf.path=".\\mfftp.ini";
int i=Convert.ToInt32(inf.IniReadValue("MFFTP_Options","HostNum"));
//string serAdd=inf.IniReadValue("MFFTP_OptionsHost0","HostIp");
string ServerName= "MFFTP_OptionsHost"+i;
inf.IniWriteValue(ServerName,"HostName",hostname);
inf.IniWriteValue(ServerName,"HostIp",hostip);
inf.IniWriteValue(ServerName,"LoginName",loginname);
inf.IniWriteValue(ServerName,"LoginPwd",loginpwd);
inf.IniWriteValue(ServerName,"MyDir",mydir);
i=i+1;
inf.IniWriteValue("MFFTP_Options","HostNum",i.ToString());
this.standm.sername(hostname);
this.Close();
}
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace MFFTP
{
///
/// CreatNewName 的摘要说明。
///
public class CreatNewName : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox text_newName;
private System.Windows.Forms.Button but_Ok;
private System.Windows.Forms.Button but_Cancel;
///
/// 必需的设计器变量。
///
private System.ComponentModel.Container components = null;
private MFFTP mfftp;
public CreatNewName(MFFTP FTP)
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
this.mfftp=FTP;
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
///
/// 清理所有正在使用的资源。
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows 窗体设计器生成的代码
///
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
///
private void InitializeComponent()
{
this.text_newName = new System.Windows.Forms.TextBox();
this.but_Ok = new System.Windows.Forms.Button();
this.but_Cancel = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// text_newName
//
this.text_newName.Location = new System.Drawing.Point(48, 40);
this.text_newName.Name = "text_newName";
this.text_newName.Size = new System.Drawing.Size(144, 21);
this.text_newName.TabIndex = 0;
this.text_newName.Text = "";
//
// but_Ok
//
this.but_Ok.Location = new System.Drawing.Point(56, 112);
this.but_Ok.Name = "but_Ok";
this.but_Ok.TabIndex = 1;
this.but_Ok.Text = "修 改";
this.but_Ok.Click += new System.EventHandler(this.but_Ok_Click);
//
// but_Cancel
//
this.but_Cancel.Location = new System.Drawing.Point(160, 112);
this.but_Cancel.Name = "but_Cancel";
this.but_Cancel.TabIndex = 2;
this.but_Cancel.Text = "取 消";
this.but_Cancel.Click += new System.EventHandler(this.but_Cancel_Click);
//
// CreatNewName
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(352, 174);
this.ControlBox = false;
this.Controls.Add(this.but_Cancel);
this.Controls.Add(this.but_Ok);
this.Controls.Add(this.text_newName);
this.Name = "CreatNewName";
this.Text = "重命名";
this.ResumeLayout(false);
}
#endregion
private void but_Cancel_Click(object sender, System.EventArgs e)
{
this.Close();
}
private void but_Ok_Click(object sender, System.EventArgs e)
{
string newFileName=this.text_newName.Text.Trim();
this.mfftp.newFileName(newFileName);
this.Close();
}
}
}
链接:https://pan.baidu.com/s/1Xwd0U_KktL0hRFPaggIOGQ?pwd=6688
提取码:6688