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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

7384閲覧

[C#]FTPダウンロード時に該当ファイルがない場合の処理

pbatour

総合スコア6

FTP

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/10/20 07:36

Visual Stadio C# 2019にてプログラミングをしています。

https://dobon.net/vb/dotnet/internet/ftpwebrequest.html
FTPサーバーからファイルをダウンロードするために上記URLのサイトを参考にプログラムを組んでいますが、
ダウンロード時に該当ファイルがない場合に以下の部分でエラーが発生してしまいます。

System.Net.FtpWebResponse ftpRes =
(System.Net.FtpWebResponse)ftpReq.GetResponse();

ファイルがない場合はダウンロードしないようにするためにはどうすればよいでしょうか。
また、ダウンロードしたファイルを上書きではなく"C:\test.txt"に追記したい場合は
どのように記述を変えればよいでしょうか。

初心者のためあまりC#に詳しくありません。
できればサンプルソースをいただけると助かります。

ご不明点がございましたら別途ご質問ください。
よろしくおねがいします。

C#

1//ダウンロードするファイルのURI 2Uri u = new Uri("ftp://localhost/test.txt"); 3//ダウンロードしたファイルの保存先 4string downFile = "C:\test.txt"; 5 6//FtpWebRequestの作成 7System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest) 8 System.Net.WebRequest.Create(u); 9//ログインユーザー名とパスワードを設定 10ftpReq.Credentials = new System.Net.NetworkCredential("username", "password"); 11//MethodにWebRequestMethods.Ftp.DownloadFile("RETR")を設定 12ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; 13//要求の完了後に接続を閉じる 14ftpReq.KeepAlive = false; 15//ASCIIモードで転送する 16ftpReq.UseBinary = false; 17//PASSIVEモードを無効にする 18ftpReq.UsePassive = false; 19 20//FtpWebResponseを取得 21System.Net.FtpWebResponse ftpRes = 22 (System.Net.FtpWebResponse)ftpReq.GetResponse(); 23//ファイルをダウンロードするためのStreamを取得 24System.IO.Stream resStrm = ftpRes.GetResponseStream(); 25//ダウンロードしたファイルを書き込むためのFileStreamを作成 26System.IO.FileStream fs = new System.IO.FileStream( 27 downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write); 28//ダウンロードしたデータを書き込む 29byte[] buffer = new byte[1024]; 30while (true) 31{ 32 int readSize = resStrm.Read(buffer, 0, buffer.Length); 33 if (readSize == 0) 34 break; 35 fs.Write(buffer, 0, readSize); 36} 37fs.Close(); 38resStrm.Close(); 39 40//FTPサーバーから送信されたステータスを表示 41Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription); 42//閉じる 43ftpRes.Close();

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

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

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

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

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

guest

回答2

0

ベストアンサー

FluentFTP を使用してみたらどうでしょう。

FileExists サンプル

FtpWebRequestは、Microsoftが新規開発での使用を非推奨にしているので、
使用しない方が良いかと思います。

投稿2020/10/20 08:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pbatour

2020/10/20 10:49

ちょうど今検討していたところでした。 調べてみます。ありがとうございます。
pbatour

2020/10/20 12:59

ありがとうございます。おおよそやりたいことは実現できました。
guest

0

参考にされているページにファイルの一覧を取得というものがあるのですから、一覧を取得してその中に該当のファイルがあるか確認してはどうでしょう?

また、ファイルの追記はFileStreamのコンストラクタで指定しているSystem.IO.FileMode.Createを変更すればよろしいかと思います。
FileStream(String, FileMode, FileAccess)

追記
「リスト表示とダウンロードを1つの処理でできないんですよね」とおっしゃっているので

C#

1bool ExistFTPFile(string path,string filename) 2{ 3 // ここでpathのファイル一覧を取得してその中にfilenameがあるか判断する 4 // ファイルが存在するならtrue、存在しないならfalseを返す 5}

といったファイルが存在するかチェックする関数を作って呼び出せばいいかと思います。

投稿2020/10/20 07:46

編集2020/10/20 08:32
YAmaGNZ

総合スコア10258

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

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

pbatour

2020/10/20 07:57

FtpWebRequestオブジェクトのMethodプロパティは一度宣言すると変更できないらしいので、リスト表示とダウンロードを1つの処理でできないんですよね。なのでエラーが発生した場合にダウンロードをスルーしたいのですが可能でしょうか。
YAmaGNZ

2020/10/20 08:11

1つの処理でできないなら2つにしましょう。 もしくはFtpWebRequestオブジェクトを作り直せばいいだけです。
pbatour

2020/10/20 08:41

理屈は理解できるのですが、実はたくさんのフォルダがあり、そのフォルダ内の1つ1つに該当ファイルがあればダウンロードするというような処理をしています。フォルダが大量にある場合、都度、FTPに接続し直すとかなり効率が悪いような感じがします。エラーをスルーさせたほうがいいと思うのですが。
pbatour

2020/10/20 13:00

初心者の私をいろいろ助けていただきありがとうございます。 自分の勉強不足を痛感いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問