FrontPage

今どき?って言われそうだけど、ローカルなLANの仮想ノード間のやりとりでは、まだ結構有用だと思うのよね。
まぁ、 LXCなノード同士だと、親ノード側から子ディレクトリツリーに転送するって荒業もある けどね。

さて、そんなわけでFTPアップロードしましょ。

ちなみに、ローカルとリモートのファイルは全てフルパスで定義済みよ。こうなってるの。

ローカル側 (List<string> localfiles)

c:/User/username/directory/textfile1.txt
c:/User/username/directory/textfile2.txt
:
:

リモート側 (List<string> remotefiles)

ftp://servername/directory/textfile1.txt
ftp://servername/directory/textfile2.txt
:
:

こういうリストを前もって作って作ってから、以下をコールするわけね。

       private static string uploadFTP(string username, string password, string servername, List<string> localfiles, List<string> remotefiles)
       {
           string r = "";
           try
           {
               for (int i = 0; i < localfiles.Count; i++)
               {
                   Uri u = new Uri(remotefiles[i]);
                   // Make Request
                   FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(u);

                   // user & Pass (既に定義してあるのを指定する)
                   ftpReq.Credentials = ftpCredential;
                   //// ここは以下の記述でもいい。
                   //ftpReq.Credentials = new NetworkCredential(username, password);

                   // メソッドにSTOR(アップロード)を指定。
                   ftpReq.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
                   // 要求の完了後に接続を閉じない。(デフォルトでtrueだが、あえて宣言する)
                   ftpReq.KeepAlive = true;
                   // バイナリーモードで転送
                   ftpReq.UseBinary = true;
                   // PASVモードを無効にする
                   ftpReq.UsePassive = false;
                   // 対象ファイルをStream変換
                   // get Stream from localfile
                   Stream reqStrm = ftpReq.GetRequestStream();
                   FileStream fs = new FileStream(localfiles[i], FileMode.Open, FileAccess.Read);
                   // write to reqStrm
                   byte[] buffer = new byte[1024];
                   while (true)
                   {
                       int readSize = fs.Read(buffer, 0, buffer.Length);
                       if (readSize == 0)
                           break;
                       reqStrm.Write(buffer, 0, readSize);
                   }
                   fs.Close();
                   reqStrm.Close();
                   // リクエストを行う。
                   FtpWebResponse ftpRes = (FtpWebResponse)ftpReq.GetResponse();
                   //FTPサーバーから送信されたステータスを表示
                   r = ftpRes.StatusCode.ToString(); // 大量のメッセージはいらない。最後のだけ残せば
                   r += " : " + ftpRes.StatusDescription.ToString();
                   //閉じる
                   ftpRes.Close();
               }
           }
           catch (Exception ex)
           {
               r = ex.Message;
           }
           return (r);
       }

ん?上をそのままコピペしても動かない?

ああ、それは「user & Pass (既に定義してあるのを指定する)」ってあるでしょう?これは事前に、こんな定義をしてあるのよね。

private static NetworkCredential ftpCredential;
:
:
ftpCredential = new NetworkCredential(username, password);

わたし、どうも KeepAlive な書き方っていうのが気持ち悪くてね。能動的にセッションを残しつつってイメージで書きたいというか。
その名残りみたいなものね。
だから、面倒なら以下を有効にすればいいわ。

                   //// ここは以下の記述でもいい。
                   //ftpReq.Credentials = new NetworkCredential(username, password);

そのあたりは、色々試してみてね。


トップ   編集 凍結解除 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-21 (木) 16:59:21