2012-04-17 155 views
2

我正在编写涉及多个客户端的应用程序。一个客户端使用FTP将文件上传到服务器,然后另一个客户端下载该文件并将其删除。我使用FTP服务器作为中间人来交换信息,因为我不希望用户必须前移端口。我已经想出了如何上传文件,但我无法弄清楚如何删除文件。使用FTP删除文件的命令是:使用Java从FTP服务器删除文件

DELE <filename> 

我试过这样做,但没有成功。这里是我试过的代码:我有一种感觉,<文件名>我提供的可能是错误的,因为我并没有包括在路径的目录名

public static void deleteFile(String name) throws IOException 
{ 
    URL url = new URL("ftp://a1111111:[email protected]/public_html/misc/screenshots/picture.png;type=i"); 
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(url.openConnection().getOutputStream())); 
    writer.write("DELE picture.png"); 
    writer.flush(); 
} 

。但是,由于我明确告诉URL中文件的路径,所以我不太确定我应该为<文件名>输入什么内容。

我已经阅读了本网站上有关与此非常相似的问题的其他问题,并且所有的答案都告诉了使用一个库。问题是,大多数这些库都是用纯Java编写的,因此该库的开发人员必须找出一种方法来实现我在没有库的情况下要做的事情。我也想这样做。我不喜欢附加额外的文件,除了我自己的东西,我做的。所以,请不要告诉我使用库 - 这不是我要找的。

如果您需要任何澄清,请询问!

编辑:如果我使用此代码收到答复:

byte[] response = new byte[conn.getInputStream().available()]; 
    conn.getInputStream().read(response); 
    System.out.println("Response: " + new String(response)); 

我的命令只是获取回送:

Response: DELE test1.png 
+0

你确信你可以从一个有趣的'URL'对象实际运行多个FTP命令('GET' _and_'DELE')吗?这对我来说似乎不太可能。抛出什么异常或服务器的回复是什么? (如果你还没有运行Wireshark来观察事务) – sarnold 2012-04-17 02:52:25

+0

我不确定这是否正常,但是在写入DELE命令后,我从通过连接建立的输入流中收到68。编辑:在用不同的代码尝试响应之后,输入流只是回应我写入的内容。 – 2012-04-17 03:02:59

+1

'68'?那很好笑。 [FTP状态码长度为三位数字。](http://www.ietf.org/rfc/rfc959.txt)。 – sarnold 2012-04-17 03:08:49

回答

1

我认为你需要做的检索和删除两个独立的操作; some random documentation I found for FtpURLConnection部分地说:

此类在给定URL的情况下打开FTP输入(或输出)流。它可以作为一个一杆FTP传输:

登录
获取(或PUT)文件
断开

我没有看到,将允许删除文件的文档中的任何方法。

您可能希望使用URL机制来检索文件,但我会下拉到使用原始套接字来删除该文件。创建到FTP命令端口的新连接,登录并手动发出DELE命令。如果这是您采取的唯一步骤,那么您可能能够避免执行相对较差的错误处理,并且可能只需要两个请求,并在完成后直接向用户显示输出副本。

这有点脏,但我完全明白,不想携带一兆字节的额外资源来达到echo -e "user foo\npass password\ndele /path/to/file\nlogout" | nc ftp.remote.example.com 21的道德等值。

+0

我将如何去建立一个使用FTP的服务器套接字连接? – 2012-04-17 03:27:13

+1

只需阅读[RFC 959,FTP规范](http://www.ietf.org/rfc/rfc959.txt)。很多其他人已经用Java为你实现了它。 – BalusC 2012-04-17 03:39:35