zoukankan
html css js c++ java
.NET中完成FTP各功能操作
1.FTP工厂类
using
System;
using
System.Configuration;
using
System.IO;
using
System.Net;
using
System.Net.Sockets;
using
System.Text;
using
System.Threading;
namespace
School.Common
{
/**/
///
<summary>
///
类 编 号: 0043
///
类 名 称: FTPFactory
///
内容摘要: FTP工厂,完成FTP各功能操作
///
完成日期: 2007-1-12 10:38:36
///
编码作者: 林付国
///
</summary>
public
class
FTPFactory
{
成员变量
#region
成员变量
//
static readonly log4net.ILog log = log4net.LogManager.GetLogger("log4net");
private
string
remoteHost, remotePath, remoteUser, remotePass, mes;
private
int
remotePort
=
21
, bytes;
private
Socket clientSocket;
private
int
retValue;
private
Boolean debug;
private
Boolean logined;
private
string
reply;
private
static
int
BLOCK_SIZE
=
512
;
private
Byte[] buffer
=
new
Byte[BLOCK_SIZE];
private
Encoding ASCII
=
Encoding.ASCII;
//
FTP当前处理信息事件
public
event
FTPProcessInfoEventHandler SetProcessInfoEvent;
#endregion
构造方法
#region
构造方法
public
FTPFactory()
{
//
string FTPRemoteIP = ConfigurationSettings.AppSettings["FTPRemoteIP"];
//
int FTPRemotePort = Convert.ToInt32(ConfigurationSettings.AppSettings["FTPRemotePort"]);
//
string FTPUser = ConfigurationSettings.AppSettings["FTPUser"];
//
string FTPPassword = ConfigurationSettings.AppSettings["FTPPassword"];
//
remoteHost = FTPRemoteIP;
remotePath
=
"
.
"
;
//
remoteUser = FTPUser;
//
remotePass = FTPPassword;
//
remotePort = FTPRemotePort;
debug
=
false
;
logined
=
false
;
}
#endregion
基本信息设置
#region
基本信息设置
/**/
///
///
Set the name of the FTP server to connect to.
///
///
Server name
public
void
setRemoteHost(
string
remoteHost)
{
this
.remoteHost
=
remoteHost;
}
/**/
///
///
Return the name of the current FTP server.
///
///
Server name
public
string
getRemoteHost()
{
return
remoteHost;
}
/**/
///
///
Set the port number to use for FTP.
///
///
Port number
public
void
setRemotePort(
int
remotePort)
{
this
.remotePort
=
remotePort;
}
/**/
///
///
Return the current port number.
///
///
Current port number
public
int
getRemotePort()
{
return
remotePort;
}
/**/
///
///
Set the remote directory path.
///
///
The remote directory path
public
void
setRemotePath(
string
remotePath)
{
this
.remotePath
=
remotePath;
}
/**/
///
///
Return the current remote directory path.
///
///
The current remote directory path.
public
string
getRemotePath()
{
return
remotePath;
}
/**/
///
///
Set the user name to use for logging into the remote server.
///
///
Username
public
void
setRemoteUser(
string
remoteUser)
{
this
.remoteUser
=
remoteUser;
}
/**/
///
///
Set the password to user for logging into the remote server.
///
///
Password
public
void
setRemotePass(
string
remotePass)
{
this
.remotePass
=
remotePass;
}
#endregion
属性
#region
属性
/**/
///
<summary>
///
是否登录成功
///
</summary>
public
bool
GetLogin
{
get
{
return
this
.logined;
}
}
#endregion
功能操作
#region
功能操作
/**/
///
///
Return a string array containing the remote directory's file list.
///
///
///
public
string
[] getFileList(
string
mask)
{
if
(
!
logined)
{
login();
}
Socket cSocket
=
createDataSocket();
sendCommand(
"
NLST
"
+
mask);
if
(
!
(retValue
==
150
||
retValue
==
125
))
{
throw
new
IOException(reply.Substring(
4
));
}
mes
=
""
;
Thread.Sleep(
700
);
while
(
true
)
{
if
(cSocket.Connected)
{
int
bytes
=
cSocket.Receive(buffer, buffer.Length,
0
);
mes
+=
ASCII.GetString(buffer,
0
, bytes);
if
(bytes
<
buffer.Length)
{
break
;
}
}
else
{
this
.SetProcessInfoText(
"
socket 连接已断!
"
);
//
log.Info("socket 连接断了!");
}
}
//
log.Info(mes);
char
[] seperator
=
{
'
\n
'
}
;
string
[] mess
=
mes.Split(seperator);
//
foreach(string fileName in mess)
//
{
//
log.Info(fileName);
//
}
cSocket.Close();
readReply();
if
(retValue
!=
226
)
{
throw
new
IOException(reply.Substring(
4
));
}
return
mess;
}
public
string
[] getFileList()
{
if
(
!
logined)
{
login();
}
Socket cSocket
=
createDataSocket();
sendCommand(
"
LIST
"
);
if
(
!
(retValue
==
150
||
retValue
==
125
))
{
throw
new
IOException(reply.Substring(
4
));
}
mes
=
""
;
while
(
true
)
{
int
bytes
=
cSocket.Receive(buffer, buffer.Length,
0
);
mes
+=
ASCII.GetString(buffer,
0
, bytes);
if
(bytes
<
buffer.Length)
{
break
;
}
}
//
log.Info(mes);
char
[] seperator
=
{
'
\n
'
}
;
string
[] mess
=
mes.Split(seperator);
cSocket.Close();
readReply();
if
(retValue
!=
226
)
{
throw
new
IOException(reply.Substring(
4
));
}
return
mess;
}
/**/
///
///
Return the size of a file.
///
///
///
public
long
getFileSize(
string
fileName)
{
if
(
!
logined)
{
login();
}
sendCommand(
"
SIZE
"
+
fileName);
long
size
=
0
;
if
(retValue
==
213
)
{
size
=
Int64.Parse(reply.Substring(
4
));
}
else
{
throw
new
IOException(reply.Substring(
4
));
}
return
size;
}
/**/
///
///
Login to the remote server.
///
public
void
login()
{
this
.SetProcessInfoText(
"
连接中
"
);
clientSocket
=
new
Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep
=
new
IPEndPoint(Dns.Resolve(remoteHost).AddressList[
0
], remotePort);
try
{
clientSocket.Connect(ep);
}
catch
(Exception)
{
this
.SetProcessInfoText(
"
连接失败!
"
);
//
throw new IOException("Couldn't connect to remote server");
}
try
{
readReply();
if
(retValue
!=
220
)
{
close();
//
throw new IOException(reply.Substring(4));
}
if
(debug)
Console.WriteLine(
"
USER
"
+
remoteUser);
this
.SetProcessInfoText(
"
检测用户名!
"
);
sendCommand(
"
USER
"
+
remoteUser);
if
(
!
(retValue
==
331
||
retValue
==
230
))
{
this
.SetProcessInfoText(
"
检测用户名失败!
"
);
cleanup();
//
throw new IOException(reply.Substring(4));
}
if
(retValue
!=
230
)
{
if
(debug)
Console.WriteLine(
"
PASS xxx
"
);
this
.SetProcessInfoText(
"
检测用户密码!
"
);
sendCommand(
"
PASS
"
+
remotePass);
if
(
!
(retValue
==
230
||
retValue
==
202
))
{
this
.SetProcessInfoText(
"
检测用户密码失败!
"
);
cleanup();
//
throw new IOException(reply.Substring(4));
}
}
logined
=
true
;
//
Console.WriteLine("Connected to " + remoteHost);
this
.SetProcessInfoText(
"
连接成功!
"
);
chdir(remotePath);
}
catch
(Exception)
{
this
.SetProcessInfoText(
"
连接失败!
"
);
//
throw new IOException("Couldn't connect to remote server");
}
}
/**/
///
///
If the value of mode is true, set binary mode for downloads.
///
Else, set Ascii mode.
///
///
public
void
setBinaryMode(Boolean mode)
{
if
(mode)
{
sendCommand(
"
TYPE I
"
);
}
else
{
sendCommand(
"
TYPE A
"
);
}
if
(retValue
!=
200
)
{
throw
new
IOException(reply.Substring(
4
));
}
}
/**/
///
///
Download a file to the Assembly's local directory,
///
keeping the same file name.
///
///
public
void
download(
string
remFileName)
{
download(remFileName,
""
,
false
);
}
/**/
///
///
Download a remote file to the Assembly's local directory,
///
keeping the same file name, and set the resume flag.
///
///
///
public
void
download(
string
remFileName, Boolean resume)
{
download(remFileName,
""
, resume);
}
/**/
///
///
Download a remote file to a local file name which can include
///
a path. The local file name will be created or overwritten,
///
but the path must exist.
///
///
///
public
void
download(
string
remFileName,
string
locFileName)
{
download(remFileName, locFileName,
false
);
}
/**/
///
///
Download a remote file to a local file name which can include
///
a path, and set the resume flag. The local file name will be
///
created or overwritten, but the path must exist.
///
///
///
///
public
void
download(
string
remFileName,
string
locFileName, Boolean resume)
{
if
(
!
logined)
{
login();
}
setBinaryMode(
false
);
Console.WriteLine(
"
Downloading file
"
+
remFileName
+
"
from
"
+
remoteHost
+
"
//
"
+
remotePath);
if
(locFileName.Equals(
""
))
{
locFileName
=
remFileName;
}
if
(
!
File.Exists(locFileName))
{
Stream st
=
File.Create(locFileName);
st.Close();
}
FileStream output
=
new
FileStream(locFileName, FileMode.Create);
Socket cSocket
=
createDataSocket();
long
offset
=
0
;
if
(resume)
{
offset
=
output.Length;
if
(offset
>
0
)
{
setBinaryMode(
false
);
sendCommand(
"
REST
"
+
offset);
if
(retValue
!=
350
)
{
//
throw new IOException(reply.Substring(4));
//
Some servers may not support resuming.
offset
=
0
;
}
}
if
(offset
>
0
)
{
if
(debug)
{
Console.WriteLine(
"
seeking to
"
+
offset);
}
long
npos
=
output.Seek(offset, SeekOrigin.Begin);
Console.WriteLine(
"
new pos=
"
+
npos);
}
}
sendCommand(
"
RETR
"
+
remFileName);
if
(
!
(retValue
==
150
||
retValue
==
125
))
{
throw
new
IOException(reply.Substring(
4
));
}
while
(
true
)
{
bytes
=
cSocket.Receive(buffer, buffer.Length,
0
);
output.Write(buffer,
0
, bytes);
if
(bytes
<=
0
)
{
break
;
}
}
output.Close();
if
(cSocket.Connected)
{
cSocket.Close();
}
Console.WriteLine(
""
);
readReply();
if
(
!
(retValue
==
226
||
retValue
==
250
))
{
throw
new
IOException(reply.Substring(
4
));
}
}
/**/
///
///
Upload a file.
///
///
public
void
upload(
string
fileName)
{
upload(fileName,
false
);
}
/**/
///
///
Upload a file and set the resume flag.
///
///
///
public
void
upload(
string
fileName, Boolean resume)
{
if
(
!
logined)
{
login();
}
Socket cSocket
=
createDataSocket();
long
offset
=
0
;
if
(resume)
{
try
{
setBinaryMode(
true
);
offset
=
getFileSize(fileName);
}
catch
(Exception)
{
offset
=
0
;
}
}
if
(offset
>
0
)
{
sendCommand(
"
REST
"
+
offset);
if
(retValue
!=
350
)
{
//
throw new IOException(reply.Substring(4));
//
Remote server may not support resuming.
offset
=
0
;
}
}
/**/
/*
==========================
*/
sendCommand(
"
STOR
"
+
Path.GetFileName(fileName));
if
(
!
(retValue
==
125
||
retValue
==
150
))
{
throw
new
IOException(reply.Substring(
4
));
}
//
open input stream to read source file
FileStream input
=
new
FileStream(fileName, FileMode.Open);
if
(offset
!=
0
)
{
if
(debug)
{
Console.WriteLine(
"
seeking to
"
+
offset);
}
input.Seek(offset, SeekOrigin.Begin);
}
Console.WriteLine(
"
Uploading file
"
+
fileName
+
"
to
"
+
remotePath);
while
((bytes
=
input.Read(buffer,
0
, buffer.Length))
>
0
)
{
cSocket.Send(buffer, bytes,
0
);
}
input.Close();
Console.WriteLine(
""
);
if
(cSocket.Connected)
{
cSocket.Close();
}
readReply();
if
(
!
(retValue
==
226
||
retValue
==
250
))
{
throw
new
IOException(reply.Substring(
4
));
}
}
/**/
///
///
Delete a file from the remote FTP server.
///
///
public
void
deleteRemoteFile(
string
fileName)
{
if
(
!
logined)
{
login();
}
sendCommand(
"
DELE
"
+
fileName);
if
(retValue
!=
250
)
{
throw
new
IOException(reply.Substring(
4
));
}
}
/**/
///
///
Rename a file on the remote FTP server.
///
///
///
public
void
renameRemoteFile(
string
oldFileName,
string
newFileName)
{
if
(
!
logined)
{
login();
}
sendCommand(
"
RNFR
"
+
oldFileName);
if
(retValue
!=
350
)
{
throw
new
IOException(reply.Substring(
4
));
}
//
known problem
//
rnto will not take care of existing file.
//
i.e. It will overwrite if newFileName exist
sendCommand(
"
RNTO
"
+
newFileName);
if
(retValue
!=
250
)
{
throw
new
IOException(reply.Substring(
4
));
}
}
/**/
///
///
Create a directory on the remote FTP server.
///
///
public
void
mkdir(
string
dirName)
{
if
(
!
logined)
{
login();
}
sendCommand(
"
MKD
"
+
dirName);
if
(retValue
!=
250
)
{
throw
new
IOException(reply.Substring(
4
));
}
}
/**/
///
///
Delete a directory on the remote FTP server.
///
///
public
void
rmdir(
string
dirName)
{
if
(
!
logined)
{
login();
}
sendCommand(
"
RMD
"
+
dirName);
if
(retValue
!=
250
)
{
throw
new
IOException(reply.Substring(
4
));
}
}
/**/
///
///
Change the current working directory on the remote FTP server.
///
///
public
void
chdir(
string
dirName)
{
if
(dirName.Equals(
"
.
"
))
{
return
;
}
if
(
!
logined)
{
login();
}
sendCommand(
"
CWD
"
+
dirName);
if
(retValue
!=
250
)
{
throw
new
IOException(reply.Substring(
4
));
}
this
.remotePath
=
dirName;
Console.WriteLine(
"
Current directory is
"
+
remotePath);
}
/**/
///
///
Close the FTP connection.
///
public
void
close()
{
if
(clientSocket
!=
null
)
{
sendCommand(
"
QUIT
"
);
}
cleanup();
Console.WriteLine(
"
Closing
"
);
}
/**/
///
///
Set debug mode.
///
///
public
void
setDebug(Boolean debug)
{
this
.debug
=
debug;
}
private
void
readReply()
{
mes
=
""
;
reply
=
readLine();
retValue
=
Int32.Parse(reply.Substring(
0
,
3
));
}
private
void
cleanup()
{
if
(clientSocket
!=
null
)
{
clientSocket.Close();
clientSocket
=
null
;
}
logined
=
false
;
}
private
string
readLine()
{
while
(
true
)
{
bytes
=
clientSocket.Receive(buffer, buffer.Length,
0
);
mes
+=
ASCII.GetString(buffer,
0
, bytes);
if
(bytes
<
buffer.Length)
{
break
;
}
}
char
[] seperator
=
{
'
\n
'
}
;
string
[] mess
=
mes.Split(seperator);
if
(mes.Length
>
2
)
{
mes
=
mess[mess.Length
-
2
];
}
else
{
mes
=
mess[
0
];
}
if
(
!
mes.Substring(
3
,
1
).Equals(
"
"
))
{
return
readLine();
}
if
(debug)
{
for
(
int
k
=
0
; k
<
mess.Length
-
1
; k
++
)
{
Console.WriteLine(mess[k]);
}
}
return
mes;
}
private
void
sendCommand(String command)
{
Byte[] cmdBytes
=
Encoding.ASCII.GetBytes((command
+
"
\r\n
"
).ToCharArray());
clientSocket.Send(cmdBytes, cmdBytes.Length,
0
);
readReply();
}
private
Socket createDataSocket()
{
sendCommand(
"
PASV
"
);
if
(retValue
!=
227
)
{
throw
new
IOException(reply.Substring(
4
));
}
int
index1
=
reply.IndexOf(
'
(
'
);
int
index2
=
reply.IndexOf(
'
)
'
);
string
ipData
=
reply.Substring(index1
+
1
, index2
-
index1
-
1
);
int
[] parts
=
new
int
[
6
];
int
len
=
ipData.Length;
int
partCount
=
0
;
string
buf
=
""
;
for
(
int
i
=
0
; i
<
len
&&
partCount
<=
6
; i
++
)
{
char
ch
=
Char.Parse(ipData.Substring(i,
1
));
if
(Char.IsDigit(ch))
buf
+=
ch;
else
if
(ch
!=
'
,
'
)
{
throw
new
IOException(
"
Malformed PASV reply:
"
+
reply);
}
if
(ch
==
'
,
'
||
i
+
1
==
len)
{
try
{
parts[partCount
++
]
=
Int32.Parse(buf);
buf
=
""
;
}
catch
(Exception)
{
throw
new
IOException(
"
Malformed PASV reply:
"
+
reply);
}
}
}
string
ipAddress
=
parts[
0
]
+
"
.
"
+
parts[
1
]
+
"
.
"
+
parts[
2
]
+
"
.
"
+
parts[
3
];
int
port
=
(parts[
4
]
<<
8
)
+
parts[
5
];
Socket s
=
new
Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout,
5000
);
IPEndPoint ep
=
new
IPEndPoint(Dns.Resolve(ipAddress).AddressList[
0
], port);
try
{
s.Connect(ep);
}
catch
(Exception)
{
throw
new
IOException(
"
Can't connect to remote server
"
);
}
return
s;
}
#endregion
信息输出方法
#region
信息输出方法
private
void
SetProcessInfoText(
string
str)
{
try
{
if
(
this
.SetProcessInfoEvent
!=
null
)
{
this
.SetProcessInfoEvent(str);
}
}
catch
(Exception err)
{
throw
(err);
}
}
#endregion
}
}
2.调用方法
// 检查此FTP是否可用
FTPFactory ftp = new FTPFactory();
ftp.setRemoteHost(主机名);
ftp.setRemoteUser(用户名);
ftp.setRemotePass(密码);
ftp.setRemotePort(端口);
ftp.setRemotePath(路径);
ftp.login();
if (!ftp.GetLogin)
{
// 提示连接失败
this.Cursor = Cursors.Default;
return;
}
ftp.close();
查看全文
相关阅读:
01 drf源码剖析之restful规范
08 Flask源码剖析之flask拓展点
07 flask源码剖析之用户请求过来流程
06 flask源码剖析之路由加载
05 flask源码剖析之配置加载
04 flask源码剖析之LocalStack和Local对象实现栈的管理
03 flask源码剖析之threading.local和高级
02 flask源码剖析之flask快速使用
01 flask源码剖析之werkzurg 了解wsgi
MVC之Filter
原文地址:https://www.cnblogs.com/linfuguo/p/716828.html
最新文章
jQuery笔记---选择器
jQuery笔记一
java基础(2)
java基础
第三方插件将数据转成json
Redis笔记---set
HtML5 form表单
json总结
Ajax使用
JS总结
热门文章
【leetcode 简单】 第一百五十题 两个列表的最小索引总和
【leetcode 简单】 第一百一十题 分发饼干
【leetcode 简单】 第一百零九题 最小移动次数使数组元素相等
【leetcode 简单】 第一百零八题 找到所有数组中消失的数字
【leetcode 简单】 第一百零七题 回旋镖的数量
【leetcode 简单】 第一百零六题 压缩字符串
【leetcode 简单】 第九十九题 字符串相加
【leetcode 简单】 第九十八题 第三大的数
【leetcode 简单】 第九十七题 快乐数
【leetcode 简单】 第九十六题 最长回文串
Copyright © 2011-2022 走看看