2017-02-07 3 views
0

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(); 
     } 

ответ

0

Когда вы конкатенации имя файла, чтобы создать URL для веб-запроса, вам придется бежать имя файла с помощью percent-enconding, в противном случае символы после «#», считаются URL fragment вместо того, чтобы быть частью имени файла.

Я предлагаю использовать функцию, подобную Uri.EscapeDataString() Вместо Replace("#", "%23"), поскольку она правильно обрабатывает все остальные зарезервированные символы (такие как «@»).

FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://" + targetServer + targetPath + Uri.EscapeDataString(fileInfo.Name)); 

Если TargetPath может содержать зарезервированные символы, вам может понадобиться, чтобы избежать его тоже.

+0

Спасибо. Это то, что я искал. Очень признателен. –

Смежные вопросы