#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);
そのあたりは、色々試してみてね。