質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

0回答

1825閲覧

ftpサーバーのファイル情報取得時にアクセス拒否されてしまう

0sksksk

総合スコア17

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/10/02 02:25

編集2020/10/02 02:46

#現在取り組んでいること
javaでsocket通信を利用してffftpのようなftpクライアントアプリを作成してします。

#やりたいこと
ftpサーバーにあるファイルの情報を取得して、別クラスの下記メソッドの引数にしたい。
下記メソッドを実行することで、ftpサーバーに保存されているファイルがアプリ上に一覧表示される。

Java

1 private void setFiles(File file, DefaultListModel<File> listModel) { // フォルダとファイルをリストに追加 2 listModel.removeAllElements(); // 全クリア 3 File[] files = file.listFiles(); 4 if (files == null) 5 return; 6 7 for (File f : files) { 8 if (f.isDirectory()) 9 listModel.addElement(f); // フォルダを追加 10 } 11 for (File f : files) { 12 if (f.isFile()) 13 listModel.addElement(f); // ファイルを追加 14 } 15 } 16 17 private static class FileListCellRenderer extends DefaultListCellRenderer { // ファイルアイコン表示 18 private final FileSystemView fs = FileSystemView.getFileSystemView(); 19 20 public Component getListCellRendererComponent(JList list, Object value, 21 int index, boolean isSelected, boolean cellHasFocus) { 22 super.getListCellRendererComponent(list, value, index, isSelected, 23 cellHasFocus); 24 25 if (value instanceof File) { 26 File f = (File) value; 27 setText(fs.getSystemDisplayName(f)); 28 setIcon(fs.getSystemIcon(f)); 29 } 30 return this; 31 } 32 }

#問題
下記プログラムを実行した際、86行目のFileOutputStream fo = new FileOutputStream(file);を通るときに、アクセスが拒否されましたとエラーが表示されてしまう。

Java

1import java.io.BufferedReader; 2import java.io.DataInputStream; 3import java.io.File; 4import java.io.FileOutputStream; 5import java.io.InputStreamReader; 6import java.io.PrintWriter; 7import java.net.ServerSocket; 8import java.net.Socket; 9 10class List { 11 12 public static void main(String args[]){ 13 String host = "ipアドレス"; 14 int ctrl_port = 8021; 15 String user = "ユーザネーム"; 16 String pass = "パスワード"; 17 String home = "/"; 18 19 Socket ctrlSocket = null; 20 PrintWriter ctrlOutput = null; 21 22 Socket dataSocket = null; 23 BufferedReader dataReader = null; 24 25 try { 26 // FTPサーバと8021番ポートでコネクションをはる 27 ctrlSocket = new Socket(host, ctrl_port); 28 29 // コマンドを書くよう 30 ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream()); 31 32 // FTPクライアント(このプログラムを実行するホスト)のアドレスを取得 33 byte[] local_address = ctrlSocket.getLocalAddress().getAddress(); 34 35 // FTPログイン 36 ctrlOutput.println("USER " + user); 37 ctrlOutput.flush(); 38 ctrlOutput.println("PASS " + pass); 39 ctrlOutput.flush(); 40 41 // ディレクトリに移動 42 ctrlOutput.println("CWD " + home); 43 ctrlOutput.flush(); 44 45 // 接続をまつ 46 ServerSocket dataServerSocket = new ServerSocket(0, 1); 47 // 待ちうけポートを取得 48 int data_port = dataServerSocket.getLocalPort(); 49 50 // PORTコマンドを作成 51 String port_command = "PORT "; 52 for (byte b : local_address) { 53 port_command += (b & 0xff) + ","; 54 } 55 port_command += (data_port / 256) & 0xff; 56 port_command += ","; 57 port_command += data_port & 0xff; 58 59 // FTPサーバに待ちうけている場所を教えてあげる 60 ctrlOutput.println(port_command); 61 ctrlOutput.flush(); 62 63 // NLSTコマンド 64 ctrlOutput.println("LIST"); 65 ctrlOutput.flush(); 66 67 // サーバからの接続をうけつける 68 dataSocket = dataServerSocket.accept(); 69 dataServerSocket.close(); 70 71 // サーバから送られてくる情報をよみとる 72 dataReader = new BufferedReader(new InputStreamReader( 73 dataSocket.getInputStream())); 74 75 System.out.println("dataReader =" + dataReader); 76 77 for (String line = dataReader.readLine(); line != null; line = dataReader 78 .readLine()) { 79 // 表示 80 System.out.println("line ="+line); 81 } 82 83 DataInputStream di = new DataInputStream(dataSocket.getInputStream()); 84 File file = new File("/ファイル名"); 85 System.out.println("file = "+file); 86 FileOutputStream fo = new FileOutputStream(file); 87 System.out.println("ここで止まります。"); 88 89 90 int length = di.readInt(); 91 if(length > 0) { 92 byte[] data = new byte[length]; 93 di.readFully(data, 0, data.length); 94 fo.write(data); 95 } 96 97 98 } catch (Exception e) { 99 e.printStackTrace(); 100 } finally { 101 if (dataReader != null) { 102 try { 103 dataReader.close(); 104 } catch (Exception e) { 105 e.printStackTrace(); 106 } 107 } 108 if (dataSocket != null) { 109 try { 110 dataSocket.close(); 111 } catch (Exception e) { 112 e.printStackTrace(); 113 } 114 } 115 116 if (ctrlOutput != null) { 117 ctrlOutput.close(); 118 } 119 if (ctrlSocket != null) { 120 try { 121 ctrlSocket.close(); 122 } catch (Exception e) { 123 e.printStackTrace(); 124 } 125 } 126 } 127 } 128 129} 130

#わからないこと
アクセスが拒否される原因

  • 何かコードが足りないのか
  • プログラムではなくftpサーバー上でアクセス権限の設定しないといけないのか。

#エラーメッセージ
以下が実行時に表示されるエラーメッセージです。
java.io.FileNotFoundException: \test.txt (アクセスが拒否されました。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at List.main(List.java:86)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/10/02 02:34

エラーメッセージを提示しましょう
dodox86

2020/10/02 02:35

タグにつけている"Socket.IO"はJavaScriptのNode.jsのライブラリを指しているので、Java、およびソケット通信とはまた別モノです。外しましょう。
0sksksk

2020/10/02 02:46

y_walwalさん ご指摘ありがとうございます。 質問本文にエラーメッセージを追加しました。
0sksksk

2020/10/02 02:47

dodox86さん ご指摘ありがとうございます。 Socket.IOタグは外しました。 今まで同じものだと勘違いしていました。
dodox86

2020/10/02 02:49

> 今まで同じものだと勘違いしていました。 紛らわしいとは私も思いますが、タグにマウスカーソルを置いてホバーさせると、概要が表示されます。
kuma_kuma_

2020/10/02 02:49

fileはローカルに出力するファイルですか? そうであればパス指定間違っていませんか?
0sksksk

2020/10/02 02:56

dodox86さん >タグにマウスカーソルを置いてホバーさせると、概要が表示されます。 今までこのような機能があるとは知りませんでした。 ありがとうございます。
0sksksk

2020/10/02 03:00 編集

kuma_kumaさん ご指摘ありがとうございます。 私は「/ファイル名」のところはftpサーバー上にあるファイルパスを入力するのだと 思っているのですが、違うのでしょうか。 ちなみにローカルにあるパスを指定した場合、以下のエラーが表示されます。 java.io.EOFException at java.io.DataInputStream.readInt(DataInputStream.java:392) at List.main(List.java:90)
kuma_kuma_

2020/10/02 04:09

いいえ機能を拝見した限り「ローカルに内容をコピーして」使うのかな? と思ったのでこちらで記載させていただきました。 間違っていたらすみません。 たしか一度FTPのカレントパス書きこみ先に変更しなくてはいけなかったと記憶しているのですが... この場合"/"に移動して、「new File("/ファイル名");」は「new File("ファイル名");」 あと別FTPソフト等でその場所にファイルは書き込み(アップロード)できるのですか?
0sksksk

2020/10/02 04:21

kuma_kumaさん >機能を拝見した限り「ローカルに内容をコピーして」使うのかな? 本当はftpサーバーにあるファイル情報をそのまま一覧表示できるようなメソッドが組めればよかったのですが、ローカルのファイルを一覧表示するメソッドをなんとか再利用できないかと考えて今回質問しました。 >たしか一度FTPのカレントパス書きこみ先に変更しなくてはいけなかったと記憶しているのですが... >この場合"/"に移動して、「new File("/ファイル名");」は「new File("ファイル名");」 ご指摘の通り、new File("ファイル名");とした結果、次はint length = di.readInt();で止まり、 java.io.EOFException at java.io.DataInputStream.readInt(DataInputStream.java:392) at List.main(List.java:90) というエラーが表示されるようになりました。 >あと別FTPソフト等でその場所にファイルは書き込み(アップロード)できるのですか? FFFTPではこの場所にファイルのアップロード/ダウンロードともにできています。
kuma_kuma_

2020/10/02 05:02 編集

> 次はint length = di.readInt();で止まり、 今度はinput側でエラーが発生したってこと? > // NLSTコマンド > ctrlOutput.println("LIST"); "NLST"じゃなくて"LIST"だけどよけいな付随情報ついてきてない? > DataInputStream di = new DataInputStream(dataSocket.getInputStream()); dataSocket.getInputStream()って複数行だよね?Javaってこんな書き方できたっけ?
dodox86

2020/10/03 10:05

Javaのプログラムを実行しているのはWindows環境だと思いますが、エラー自体の原因は、 > 以下が実行時に表示されるエラーメッセージです。 > java.io.FileNotFoundException: \test.txt (アクセスが拒否されました。) > at java.io.FileOutputStream.open0(Native Method) カレントドライブのルートディレクトリ(C:ドライブだったら `C:\`)に書き込みモードでファイル `test.txt` をオープンしようとするも、ルートデイレクトリだからアクセス拒否されてファイルを作成できず、`FileNotFoundException`例外になるのだと思います。一般ユーザーで書き込み可能なディレクトリ、例えば C:\temp などの下にファイルを作成するようにして試してください。 ただし、それを直したからといって全体として所望の動作になるとは限りませんので、コメントのみです。
0sksksk

2020/10/08 07:53

kuma_kumaさん ご回答ありがとうございます。 私もまだまだ理解できていない部分が多いため、すべての質問に答えられず申し訳ないのですが、 >"NLST"じゃなくて"LIST"だけどよけいな付随情報ついてきてない? 確かに取得したいのはファイル名なのですが、アクセス権限などの情報もついています。一度NLSTで行ってみます。
0sksksk

2020/10/08 07:55

dodox86さん ご回答ありがとうございます。 ルートディレクトリだとアクセス拒否されてしまうのですね。 また一つ勉強になりました。 一度C:\temp というフォルダを作成した上で実行してみます。
dodox86

2020/10/08 08:10

リモート(FTPサーバー)側で操作され、出力されている内容と、ローカル(自PC)で操作され、出力されている内容を区別しないといけません。その辺りを注意しないと、ファイルの読み取り、保存(書き込み)などがどこで行われているか分からなくなります。特にFTPは、制御用ポートとデータ用ポートの2つのTCPポートを介してやり取りしますので。
0sksksk

2020/10/12 06:22

dodox86さん。 ご指摘ありがとうございます。 dodox86さんのおっしゃる通り、このコードの実際何処でファイルを出力しているのか、いまいち理解できておらず、getやputのプログラムに関しても同じように知識があまりないまま進めてしまっていることに後悔しています。 「ファイルをリストに一覧表示したい」というゴールばかりに目が行き、そこまでの過程を飛ばしていた気はしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問