#freeze
[[FrontPage]]

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

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

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

*** ローカル側 (List<string> localfiles) [#a1ff535a]

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

*** リモート側 (List<string> remotefiles) [#l2eac7f9]

 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