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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

9674閲覧

C# SFTP通信におけるファイルのアップロード処理について

dera

総合スコア28

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2018/04/20 03:25

お世話になっております。

当方、現在ローカルサーバのフォルダにアクセスし、
その中に存在する複数のファイルをSFTP通信を用いて
別サーバのフォルダへアップロード(コピー)する処理を作っております。

環境はC#とVisualStudio2017
コンソールアプリケーションです。

ローカルサーバのフォルダ内には、アップロード対象となるファイルとそうでない
ファイルがありますので、アップロード対象となるファイルのみを抽出した
リスト(表現が曖昧で申し訳ありません。)を作成して、
そのリストを元に1ファイルずつアップロード処理を行いたいのですが、
そのリストを作る方法が思い浮かびません。

SFTP通信はSSH.NETを使用してます

C#

1 private ConnectionInfo conn; 2 3 //接続先情報作成 4 //接続先とユーザID、秘密鍵ファイル、パスワードを元に接続情報を作成 5 var authMethod = new PrivateKeyAuthenticationMethod(ユーザ名, new PrivateKeyFile(秘密鍵ファイル, パスフレーズ)); // 認証はユーザーIDと秘密鍵ファイルとパスフレーズで行う 6 conn = new ConnectionInfo(サーバ名, 22, ユーザ名, authMethod); // 接続先、使用ポート、ユーザーID、↑の認証 で接続情報を作成 7 8 //接続準備 9 using (var sftp = new SftpClient(conn)) 10 { 11 //接続開始 12 sftp.Connect(); 13            14           //ローカルサーバのディレクトリ情報 15 var di = new DirectoryInfo(ローカルサーバのフォルダパス); 16 17 //.zipで抽出 18 FileInfo[] files = di.GetFiles(".zip", SearchOption.AllDirectories); 19 20 //アップロード対象となるファイルを格納するリストの元作成(ここから不明) 21 22 //アップロード対象ファイルのリストに追加する処理 23 foreach (var items in files) 24 { 25 //ここでitemsの中身を作成したリストに追加していきたい 26 } 27 28            //ここから作成したリストを元にアップロード処理の予定 29            30           //切断 31 sftp.Disconnect(); 32 }

まだまだ初心者のため、間違っている点が多いかと思いますが、
皆様の知恵をお貸しください。よろしくお願いいたします。

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

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

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

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

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

Zuishin

2018/04/20 04:49

本人にわからないものがどうしてこちらにわかると? 拡張子とかフォルダとか何か条件がないんですか?
dera

2018/04/20 05:00

ソースの中に.zipファイルを条件に抽出しています・・。わかりづらく、申し訳ありません。
Zuishin

2018/04/20 05:01

ソースの中に zip ファイルを条件に抽出という意味がわかりませんが、zip ファイルの中に含まれるものをアップロードしたいという意味なら zip ファイルの中のリストを列挙すればいいと思います。
dera

2018/04/20 05:04

すみません、言葉足らずでした。ローカルサーバのフォルダには.txtや.zipといった様々な拡張子のファイルがあるので、その中から.zipファイルを取り出し、存在する分だけリスト(正式にはなんというのかわからないのでこの表現)に一時的に保存して、それを元に1ファイルずつアップロードしたいということです。zipファイルそのものです・・。
dera

2018/04/20 05:05

何故、リストに一時的に保存したいのかというと、万が一アップロードに失敗したら、成功したファイルをリストから除き、再度失敗したファイルのみでアップロードしたい、と考えたからです。情報不足でした。すみません。
guest

回答2

0

ベストアンサー

以下のコードで C:\SomeFolder 以下の拡張子が zip であるファイルを列挙して list に入れます。

C#

1var directoryPath = @"C:\SomeFolder"; 2var list = Directory.EnumerateFiles(directoryPath, "*.zip", SearchOption.AllDirectories).ToList();

投稿2018/04/20 05:10

Zuishin

総合スコア28660

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

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

dera

2018/04/20 07:51

ありがとうございます。無事取得できました。
guest

0

C#

1List<FileInfo> uploadFiles = new List<FileInfo>(); 2 3//アップロード対象ファイルのリストに追加する処理 4foreach (var items in files) 5{ 6 //bool isUploadFile()の中身は実装してください 7 if( !isUploadFile(items) ){ 8 continue; 9 } 10 //ここでitemsの中身を作成したリストに追加していきたい 11 12 uploadFiles.Add(items); 13}

こういう事ですか?

投稿2018/04/20 04:13

tekka

総合スコア514

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

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

dera

2018/04/20 04:23

ありがとうございます。 FileInfo型でリストを作るのは理解しました。 そのあと、foreachの中でアクセスしてると思いますが、 //bool isUploadFile()の中身は実装してください if( !isUploadFile(items) ){ continue; } ここでいう中身とは何を表しているのでしょうか? 稚拙な文章でわかりにくく申し訳ありません。 foreachで一時的に何かしら入れ物にアップロード対象のファイルを 保存して その一時的に保存した入れ物から取り出して一つずつファイルを 別サーバのフォルダにアップロードしたいということになります。
tekka

2018/04/20 04:30 編集

isUploadFileは、アップロード対象かどうかを判定するメソッドです。 private bool isUploadFile(FileInfo file) { if( アップロード対象の条件 ){ return true; } return false; } のような感じで、クラス内に実装してください。 んで、呼び元のforeach内で アップロード対象ならリストに追加 アップロード対象外なら処理せずforeachの先頭に戻る ことでアップロード対象に絞ったリストが出来るんじゃないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問