2012-04-17 100 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で書かれているので、そのライブラリの開発者はライブラリなしでやろうとしていることを実行する方法を見つけなければなりませんでした。私はそれもやりたい私は、私が作ったものに私自身のファイル以外のファイルを付けるのは好きではありません。ですから、ライブラリを使用するように教えてください。私が探しているものではありません。

説明が必要な場合は、お尋ねください。

EDIT:私は応答を受け取るために、このコードを使用する場合:私のコマンドだけでエコーバックされます

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'と '' DELE')を実際に実行できると確信していますか?それは私にはほとんどないようです。どのような例外がスローされるか、またはサーバーからの応答は何ですか? – sarnold

+0

これが正常かどうかはわかりませんが、DELEコマンドを書いた後、私は接続を通して確立された入力ストリームから68を受け取りました。編集:異なるコードでレスポンスを試した後、入力ストリームは私が書き込んだものをエコーバックします。 –

+1

'68'?それは面白い。 [FTPステータスコードは3桁です。](http://www.ietf.org/rfc/rfc959.txt)。 – sarnold

答えて

1

私はあなたが取得し、中に削除を行う必要があると思います2つの別々の操作; some random documentation I found for FtpURLConnectionは、部分的には:

このクラスはURLを指定してFTP入力(または出力)ストリームを開きます。これは、1つのショットのFTP転送として動作します。

ログイン
のGet(またはPUT)ファイル
外し

を、私は、ファイルを削除できるようになるドキュメントの任意のメソッドを見ていません。

URLメカニズムを使用してファイルを取得することもできますが、rawソケットを使用してファイルを削除することにします。 FTPコマンドポートへの新しい接続を作成し、ログインしてDELEコマンドを手動で発行します。これが唯一のステップである場合は、比較的貧弱なエラー処理を行うことで逃げることができ、たぶん2つのread()リクエストだけで、完了したらユーザーに出力のトランスクリプトを表示することができます。

これはちょっと汚いですが、echo -e "user foo\npass password\ndele /path/to/file\nlogout" | nc ftp.remote.example.com 21の道徳的な対応を達成するために、メガバイトの追加ソースを持ち歩きたくないと私は完全に理解しています。

+0

FTPを使用してサーバーとのソケット接続を確立するにはどうすればよいですか? –

+1

[RFC 959、FTP仕様](http://www.ietf.org/rfc/rfc959.txt)を読んでください。他の多くの人が既にあなたのためにJavaで実装しています。 – BalusC

関連する問題