今どき?って言われそうだけど、ローカルなLANの仮想ノード間のやりとりでは、まだ結構有用だと思うのよね。
まぁ、 LXCなノード同士だと、親ノード側から子ディレクトリツリーに転送するって荒業もある けどね。
さて、そんなわけでFTPアップロードしましょ。
ちなみに、ローカルとリモートのファイルは全てフルパスで定義済みよ。こうなってるの。
c:/User/username/directory/textfile1.txt c:/User/username/directory/textfile2.txt : :
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);
そのあたりは、色々試してみてね。