EDIT: Не уверен, что его ответ, но это обходной путь ... вместо того, чтобы смотреть на объекты передачи файлов, которые я добавил. Замените на FTP-строку и получили результат. искал, имя целевого файла теперь соответствует имени исходного файла.FtpWebRequest - Перенос имени файла, содержащего маркер фрагмента (#)
FtpWebRequest ftpRequest = (FtpWebRequest) WebRequest.Create ("ftp: //" + targetServer + targetPath + fileInfo.Name.Replace ("#", "% 23"));
У меня есть существующий процесс FTP C#, который используется в течение многих лет. Было реализовано новое соглашение об именах файлов, в котором используется символ # в имени фактического файла. Из того, что я могу сказать, # интерпретируется как маркер фрагмента во время передачи файла, что приводит к неправильному имени файла на целевом сервере.
Источник Имя файла: имя файла Target «9300T_ # test.xml»: «9300T_»
Есть ли способ, чтобы заставить фактическое имя файла, который будет использоваться?
Когда я просматриваю значения объекта во время выполнения, я вижу, что исходная строка верна, но я также вижу «# Test.xml» в свойстве «Фрагмент».
Я экспериментировал с различными свойствами WebRequest, FtpWebRequest и Uri. До сих пор я не нашел комбинацию, которая работает и не нашла решения в Интернете.
Я тестировал использование других FTP-клиентов (подсказка DOS, Mozilla), и файл передается правильно, что заставляет меня полагать, что решение управляется по свойствам, или это ограничение для объектов, которые я использую.
Ниже приведен код, который я тестирую из формы окна, которая создает проблему.
Спасибо.
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();
}
Спасибо. Это то, что я искал. Очень признателен. –