C#实现ftp文件上传,他写了一个ftp类 给我的步骤是1 ftp 2读取文件 3创建文件夹(分文件上传) 4 异常捕捉

C#实现ftp文件上传,他写了一个ftp类 给我的步骤是1 ftp 2读取文件 3创建文件夹(分文件上传) 4 异常捕捉,第1张

程序很坑是真的。你挖了很多坑在这里边。但你师傅说的两个坑其实只有一个!这个涉及到非托资源的问题,需要我们进行手动释放!

Stream就是,你既然知道Stream在使用完毕后进行close,为什么FileStream就不能Close一下?要知道不管你是FileStream还是其他的任何Stream都是继承于Stream的,而Stream就是非托资源,所以在使用后必须进行Close或Dispose!

换句话来说,你没有将FileStream对象进行Close导致某个文件一直被占用!但FileInfo却是托管资源,他不需要Close,也没有Dispose!所以它不是坑!

StreamClose()与StreamDispose()之间存在关联性,就是StreamClose()本身就会调用Dispose()!所以你写Close()是一个安全关闭的办法,会调用Dispose()的,而直接调用Dispose()也会让系统回收资源。

而真正的大坑就这一个!还有object = null;在C/CPP中会启作用,但对于net来说,没有任何作用的——GC回收并不因为你使用了null而加快回收!关于使用资源使用完毕后是,再赋值为null能不能加快回收的讨论一直都有——很多人都以为会加快回收速度,事实上属于臆猜——这个语句并不能触了GC回收,而无论是否写null对GC回收没有影响,原因是GC回收机制的限制,对于0代/1代/2代类加收的时间分别为1:10:100,除非显式调用GCCollection(),否则这个回收机制并不会受到任何影响——这是十年前的争论了。所以对于你的request = null;与程序直接退出方法是没有任何区别的,写了是很多余的!除非了你的request = null;之后还有很长时间需要运行才会退出方法!GC回收可能有影响(也是猜的)。

还有一点你可能不知道:

FileStream中的ReadBytes方法,我们一般使用长度是是4096的倍数(现在硬盘都是4k对齐),不管你是2048还是多少都是一次读一族,所谓的4k对齐就是这个作用,如果你是2048,你每两次读取同一个簇!这个如果对付小文件无可厚非,而对付大文件时就明显了!

打开你的电脑——写一个记事本(只写一个字符),看一下文件属性(文件大小为1byte,而占用空间是4k),因为磁盘缓冲等原因,所以读取时应该是4k的倍数!还有无论是2048还是4096都说明你太小心眼了——直接409600(100K)!

使用Apache 的 FTP Client (JAVA开源包commons-net-20包)获取FTP服务器上的文件列表,写一个递归循环的list()方法

当 FTP 服务器上的文件数目过多时,运行程序

FTPFile[] fs = ftplistFiles(pathName);

并且通过

for (FTPFile f : fs) {

// TODO something

}

获取目录列表,会出现如下的异常:

PORT 192,168,0,17,73,49

421 Timeout

orgapachecommonsnetftpFTPConnectionClosedException: FTP response 421 received Server closed connection

at orgapachecommonsnetftpFTP__getReply(FTPjava:346)

at orgapachecommonsnetftpFTPsendCommand(FTPjava:490)

at orgapachecommonsnetftpFTPsendCommand(FTPjava:534)

at orgapachecommonsnetftpFTPport(FTPjava:862)

at orgapachecommonsnetftpFTPClient_openDataConnection_(FTPClientjava:463)

at orgapachecommonsnetftpFTPClientinitiateListParsing(FTPClientjava:2296)

at orgapachecommonsnetftpFTPClientinitiateListParsing(FTPClientjava:2269)

at orgapachecommonsnetftpFTPClientlistFiles(FTPClientjava:2047)

因此,为了防止出现这个异常,只好采用获取RawListing的方式,然后通过正则来解析 String 得到目录列表和目录包含的文件详细信息。

=====================================

在使用了下面的部分就会经常出现问题

public static void list(FTPClient ftp, String pathName, String fileName) throws IOException {

Systemoutprintln("-----> 进入目录: " + pathName);

if (i % 20 == 0) {

//ftpchangeWorkingDirectory(pathName);

try {

writeFile(s, fileName);

s = "";

} catch (Exception e) {

eprintStackTrace();

}

try {

Random r = new Random();

int n = rnextInt(10);

Threadsleep(n 1000);

} catch (InterruptedException e) {

eprintStackTrace();

}

}

i++;

// XXXXXXXXX DO something

}

执行到ftpconnect(ftpIP)进报的错,ftpIP是有值是IP+ ": "+端口

//FTP连接

public boolean connectFTP(){

try {

ftp = new FTPClient();

if(ftpPortequals( " ")){

ftpconnect(ftpIP);

}

boolean blogin = ftplogin(ftpUser,ftpPassword);

if (!blogin) {

Systemoutprintln( "FTP连接失败: "+ftpIP);

ftpdisconnect();

ftp = null;

return false;

}

return true;

} catch (Exception e) {

eprintStackTrace();

Systemoutprintln( "FTP连接失败: "+ftpIP);

}

return false;

}

javanetInetAddressgetAllByName0(InetAddressjava:591)

javanetInetAddressgetAllByName0(InetAddressjava:560)

javanetInetAddressgetByName(InetAddressjava:492)

javanetSocket <init> (Socketjava:121)

at orgapachecommonsnetDefaultSocketFactorycreateSocket(DefaultSocketFactoryjava:53)

at orgapachecommonsnetSocketClientconnect(SocketClientjava:162)

at orgapachecommonsnetSocketClientconnect(SocketClientjava:250)

at JavaAgentconnectFTP(JavaAgentjava:432)

------解决方案--------------------

没人知道吗,急啊!!!!!!!

------解决方案--------------------

import sunnetftp;

import javaio;

import javaioIOException;

import javautilStringTokenizer;

import sunnetftp;

import javautilArrayList;

import sunnetTelnetOutputStream;

public class ftpClient {

public ftpClient() {

}

FtpClient client;

private String host= "13564160151 ";//FTP服务器IP

private String username= "anonymous ";//FTP用户名字

private String password= " ";//FTP密码

private String path = "/test "; //文件要放哪个目录

private int port = 21; //FTP端口

/

连接服务器方法

/

public void connect() {

try {

client = new FtpClient(host);

clientlogin(username, password);

//设置成2进制传输

clientbinary();

clientcd(path);

Systemoutprintln( "登陆成功 ");

}

catch (FtpLoginException e) {

Systemoutprintln( "无权限相连接 " + egetMessage());

}

catch(IOException e){

Systemoutprintln( "连接失败 "+egetMessage());

}

catch(SecurityException e){

Systemoutprintln( "用户名字或者密码不对 ");

}

}

1,确保手工用FTP客户端连接没问题。

2,手工没问题,程序也应该没问题才是。

3,确保程序中安全CLOSE连接,FTP服务器也是有连接限制的。

4,适当考虑重起一下FTP服务器。

由于服务器安全设置,只放开部分端口可以访问服务器,因此这些随意的端口都被拦截,造成无法建立FTP连接。这是服务器网管为了保证用户的安全,所以用户在FTP的时候要选用PORT模式。FTP设置帮助:FTP设置时,请勿选择在PASV模式下上传

以上就是关于C#实现ftp文件上传,他写了一个ftp类 给我的步骤是1 ftp 2读取文件 3创建文件夹(分文件上传) 4 异常捕捉全部的内容,包括:C#实现ftp文件上传,他写了一个ftp类 给我的步骤是1 ftp 2读取文件 3创建文件夹(分文件上传) 4 异常捕捉、ftp response 421 received.server closed connection 怎么解决、连接FTP时报错,救,该怎么解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9783508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存