編集:私はFTPの文字列に.Replaceを追加し、その結果Iを得たその答えはわからないが、それは回避策です...ではなく、ファイル転送オブジェクトを見ているよりも、ターゲットファイル名がソースファイル名と一致するようになりました。たFtpWebRequest - フラグメントマーカーを含むファイル名(#)を転送
FtpWebRequest ftpRequest =(FtpWebRequest)WebRequest.Create( "ftp://" + targetServer + targetPath + fileInfo.Name.Replace( "#"、 "%23"));
私は長年にわたって使用されてきた既存のC#FTPプロセスを持っています。実際のファイル名に#文字を使用する新しいファイル命名規則が実装されました。ファイル転送中に#がフラグメントマーカーとして解釈されていることから、ターゲットサーバー上のファイル名が正しくないことがわかります。
ソースファイル名:「9300T_#Test.xmlを」 ターゲットファイル名:「9300T_」
使用する実際のファイル名を強制する方法はありますか?
私は、実行時にオブジェクトの値を表示すると、私は元の文字列が正しいことを見ることができますが、私はまた、フラグメントプロパティの下に「#Test.xmlを」を参照してください。
私はWebRequestクラス、たFtpWebRequest、ウリの異なる特性を試してきました。これまでのところ、私はうまくいく組み合わせを見つけられず、Web上で解決策を見つけられませんでした。
(DOSプロンプト、Mozillaの)私は他のFTPクライアントを使用してテストしてみたとファイルが、それは私が使用しているオブジェクトに制限され、解決策は、プロパティが駆動されると信じて私をリードし、またはこれを正しく転送されます。以下は
は、私は問題を生成Windowsフォームからテストしていたコードです。
ありがとうございました。あなたはそれ以外の場合は、percent-encondingを使用してファイル名をエスケープする必要が
string sourcePath = @"C:\FILES\";
string sourcePattern = "9300T*.xml";
string targetServer = "test_server_name";
string targetPath = "/";
string targetLogin = "server_login";
string targetPassword = "login_password";
string[] uploadFiles = Directory.GetFiles(sourcePath, sourcePattern);
// Loop through and process the list.
foreach (string file in uploadFiles)
{
// Create the file information object.
FileInfo fileInfo = new FileInfo(file);
// Create the FTP request object.
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://" + targetServer + targetPath + fileInfo.Name);
ftpRequest.Credentials = new NetworkCredential(targetLogin, targetPassword);
ftpRequest.KeepAlive = false;
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.ContentLength = fileInfo.Length;
// Opens a file stream to read the file being uploaded.
FileStream readStream = fileInfo.OpenRead();
// Create the stream to which the upload file is written to.
Stream writeStream = ftpRequest.GetRequestStream(); // -- TARGET FILE IS CREATED WITH WRONG NAME AT THIS POINT
// Set the buffer size.
int bufferLength = 2048;
byte[] buffer = new byte[bufferLength];
// Read from and write to streams until content ends.
int contentLength = readStream.Read(buffer, 0, bufferLength);
while (contentLength != 0)
{
writeStream.Write(buffer, 0, contentLength);
contentLength = readStream.Read(buffer, 0, bufferLength);
}
// Flush and close the streams.
readStream.Flush();
readStream.Close();
writeStream.Flush();
writeStream.Close();
fileInfo.Delete();
}
ありがとうございます。それが私が探していたものです。とても有難い。 –