下层设计代码:
HorizontalScrollBarVisibility=\ Height=\ Width=\ HorizontalAlignment=\ VerticalAlignment=\ MouseRightButtonUp=\
SelectionChanged=\
2.2. 功能模块实现 2.2.1. 连接服务器
客户端中FtpHander类中connect方法用来实现连接服务器功能,在C#.NET中实现这一功能是借助FtpWebRequest类完成的,首先是使用FtpWebRequest类的(FtpWebRequest)FtpWebRequest.Create(new Uri(Path));方法打开远程FTP服务器,然后使用FtpWebRequest类的NetworkCredential(ftpUserId, ftpPassword);方法登录服务器。登录远程FTP服务器有两种方式,一种是注册用户登录,另一种是以匿名方式登录。使用第一种方式登录需要拥有该服务器的注册用户名和密码,匿名方式则是以anonymous作为用户名来登录。类
FtpWebRequest提供了如下两个可用于打开与FTP服务器之间的连接的方法 1.FtpWebRequest.Create(new Uri(Path))用于创建与ftp服务器端连接的对象。 2.reqFtp.UseBinary = true;用于指定数据传输类型
3.reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);用于建立一条与指定主机、指定端口上的FTP服务器的连接。本文所使用的是第一种方法进行连接,首先定义4个字符串,命名为username,password,分别用来接收来自数据输入界面的数据。然后将接收到的数据发送至服务器验证,验证成功则使用对话框函数在信息显示界面中提示连接成功,失败则显示连接失败。核心代码如下:
reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(Path));//创建对象 reqFtp.UseBinary = true;//指定传输类型
reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);//登录
24
2.2.2. 显示服务器端文件清单
客户端中实现显示服务器端的文件为FtpHander类中的GetServerFileList(DataGrid gridServerFileList,string path)函数来实现。当用户选择文件下载时,客户端会创建一个到FTP服务器的连接,同样使用FtpWebRequest类的FtpWebRequest.Create(new Uri(Path))方法和reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);操作登录到服务器,把传输格式设置为二 进 制 格 式 , 向服务器发送 reqFtp.Method =
WebRequestMethods.Ftp.ListDirectory;操作获取文件列表,利用服务器
FtpWebRequest对象的GetRequestStream ()方法获取服务器端传输过来的数据流,将流中数据写入数组缓存中,并利用streamreader对象读出文件列表的内容放入serverFileList中作为datagrid的数据源显示在datagrid中。核心代码如下:
reqFtp.Method = WebRequestMethods.Ftp.ListDirectory; WebResponse response = reqFtp.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream()); string line = reader.ReadLine(); while (line != null) {
FileName fn = new FileName(line); serverFileList.Add(fn); line = reader.ReadLine(); }
//获取文件大小
for (int i = 0; i < serverFileList.Count; i++) { try {
Connect(path + \ + serverFileList[i].name); reqFtp.Method = WebRequestMethods.Ftp.GetFileSize; response = reqFtp.GetResponse(); long fileSize = response.ContentLength; serverFileList[i].size = fileSize.ToString(); }catch(Exception){
serverFileList[i].size = \文件夹\; continue; } }
gridServerFileList.ItemsSource = serverFileList;
2.2.3. 上传文件
客户端中实现上传功能的文件为FtpHander类中的uploadFile函数来实现。当用户选择文件上传时,客户端会创建一个到FTP服务器的连接,同样使用FtpWebRequest类的FtpWebRequest.Create(new Uri(Path))方法和
25
reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);操作登录到服务器,把传输格式设置为二 进 制 格 式 , 利用要上传的本地文件构造Filelnfo对象,连接服务器,设置Method属性,通知服务器FtpWebRequest对象的GetRequestStream ()方法创建文件写入流,将缓冲中的内容写入流中,并上传到服务器。文件大小,然后利用缓冲和文件流读取文件内容,通过
FtpWebRequest将 本 地 文 件 上 传 至FTP 服 务 器 。上 传 结 束 后 关闭数据流,一般情况下FTP服务器为了保证其安全性,权限中会设置是否允许用户上传文件。上传失败时,出错处理会在对话框面板中显示出文件上传失败。上传的具体代码见附录。核心代码如下:
Connect(url);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.UploadFile;//文件上传请求 reqFtp.ContentLength = fileinfo.Length; int buffLength = 2048;
byte[] buff = new byte[buffLength]; int contentLen;
FileStream fs = fileinfo.OpenRead();//打开文件流读上传的文件 Stream stream = reqFtp.GetRequestStream(); //把上传的文件写入流 contentLen = fs.Read(buff, 0, buffLength); while( contentLen != 0 ){
stream.Write( buff,0,buffLength );
contentLen = fs.Read(buff, 0, buffLength); }
stream.Close(); fs.Close();
2.2.4. 下载文件
客户端下载文件由为FtpHander类中的downloadFile函数来实现。如果用户想要下载列表中的某一个文件,首先判断项目的类型是否是文件,如果是文件,则得到下载的文件名并下载文件,如果选中的是目录,则不能下载。用户选择好要下载的文件后,客户端打开服务器连接端口,使用FtpWebRequest类的FtpWebRequest.Create(new Uri(Path))方法和reqFtp.Credentials = new NetworkCredential(ftpUserId, ftpPassword);操作登录到服务器,把传输格式设置为二进制格式,使用ftpClient.get()函数获得文件名,下载并保存至用户指定的路径。下载完成后ftpClient.closeServer()关闭与服务器的连接并清除线程。当用户下载失败时,出错处理会在信息显示面板中显示下载出错。下载的具体代码见附录。
Connect(path + serverDirectory + \ + serverfileName);
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;//文件下载请求
26
FtpWebResponse response; Try {
response = (FtpWebResponse)reqFtp.GetResponse();//获得服务器端响应 }
catch (Exception) {
MessageBox.Show(serverfileName + \是目录!不可以下载!\return; }
Stream ftpStream =response.GetResponseStream (); cl =response.ContentLength; ///获取文件大小 int bufferSize=2048;// 设置缓冲 byte[] buffer=new byte[bufferSize];
readcount=ftpStream.Read(buffer,0,bufferSize);
FileStream fs = new FileStream(downLoadFile, FileMode.OpenOrCreate, FileAccess.Write); BinaryWriter rw = new BinaryWriter(fs, Encoding.Default); //将文件通过二进制流下载 while (readcount>0) {
rw.Write(buffer);
readcount=ftpStream.Read (buffer,0,bufferSize); }
rw.Close(); fs.Close();
2.2.5. 查询历史记录
查询历史记录功能主要是通过数据库操作来实现的,我在程序中为数据库操作封装了一个DataBaseHander类,包括查询插入删除方法,每次用户在上传或下载一次文件时,就调用DataBaseHander类的InsertHistory(string filename, string localDirectory, string addr)方法,将此次操作的文件名,存储地址和服务器地址存储进数据库中。每插入成功后就调用SelectHistory( DataGrid gridHistory)函数刷新当前页面重新显示记录内容。核心代码如下:
using (var context = new FtpdbEntities()) {
history h = new history() {
opType = \下载\, tfilename = filename,
localDirectory = localDirectory, addr = addr }; try {
context.history.AddObject(h); context.SaveChanges(); }
27
catch (Exception ex) {
MessageBox.Show(\添加失败\); } }
2.2.6. 常用地址管理
常用地址管理与历史记录查询功能一样主要是通过数据库操作来实现的,我在程序中为数据库操作DataBaseHander类添加了一个
SelectUsefulAddr(DataGrid gridAddr)方法,当打开此页时,就从数据库中读取数据,将常用的地址信息显示在datagrid中,此外,用户还可以自己插入常用的地址。每插入成功后就刷新当前页面重新显示记录内容。核心代码如下:
public void InsertUsefulAddr(string ftpName, string ftpAddr) {
using (var context = new FtpdbEntities()) {
usefulAddr ad = new usefulAddr() {
name = ftpName, addr = ftpAddr, }; try {
context.usefulAddr.AddObject(ad); context.SaveChanges(); }
catch (Exception ex) {
MessageBox.Show(\添加失败\); } } }
3. 数据库建设
3.1. 数据库表结构
因为FTP服务器的主要功能为文件的上传和下载,所以数据库表并不多,主要用于存储下载上传记录和常用的IP地址数据表。
表结构如下图所示: 历史记录表:
28