2014年5月6日火曜日

C#でFtpWebRequestを使ったリネームがうまくいかない話

最近、C#でFTPを使ってサーバー上のファイルを移動しようとしてはまりました。

ソースはこちら(例外処理など、一部を省略してます)。

    Uri uri = new Uri("ftp://...");
    string destPath = "/path/to/move"; 
    FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(uri);
    ftpReq.Credentials = new NetworkCredential(this.userName, this.password);
    ftpReq.Method = WebRequestMethods.Ftp.Rename;
    ftpReq.KeepAlive = false;
    ftpReq.RenameTo = destPath;
    FtpWebResponse ftpRes = (FtpWebResponse)ftpReq.GetResponse(); 
 
このとき、ftpReq.RenameToの値は正しい値が入っているのですが、FTPサーバーのログを見ると、RNTOに指定されているパスが壊れており、結果としてステータス550で処理に失敗します。
どうやらこちらを見ると、Visual Studio 2010と.NET Framework 4.0の組み合わせでそうなっているらしく、.NET Frameworkのバージョンを4.5にアップしたら問題は解消されていました。