2017-02-07 4 views
0

EDIT: Nicht sicher, es ist die Antwort, aber es ist eine Umgehungsmöglichkeit ... anstatt auf die Dateiübertragung Objekte, die ich hinzugefügt. Ersetzen Sie die FTP-Zeichenfolge und habe das Ergebnis I gesucht hat, stimmt der Name der Zieldatei jetzt mit dem Quelldateinamen überein.FtpWebRequest - Übertragung Dateiname mit Fragment-Marker (#)

FtpWebRequest ftpRequest = (FtpWebRequest) WebRequest.Create ("ftp: //" + Zielserver + Zielpfad + DateiInfo.Name.Replace ("#", "% 23"));


Ich habe einen vorhandenen C# FTP-Prozess, der seit Jahren im Einsatz gewesen ist. Eine neue Dateibenennungskonvention wurde implementiert, die das Zeichen # im tatsächlichen Dateinamen verwendet. Von dem, was ich sagen kann, wird das # als Fragmentmarker während der Dateiübertragung interpretiert, was zu einem falschen Dateinamen auf dem Zielserver führt.

Quelle Dateiname: Zieldateiname ‚9300T_ # Test.xml‘: ‚9300T_‘

Gibt es eine Möglichkeit, die tatsächlichen Dateinamen verwendet werden, um zu erzwingen?

Wenn ich Objektwerte während der Ausführung sehe, kann ich sehen, dass die ursprüngliche Zeichenfolge korrekt ist, aber ich sehe auch die '# Test.xml' unter der Eigenschaft Fragment.

Ich habe mit verschiedenen Eigenschaften von WebRequest, FtpWebRequest und Uri experimentiert. Bisher habe ich keine Kombination gefunden, die funktioniert und im Internet keine Lösung gefunden hat.

Ich habe mit anderen FTP-Clients (DOS-Eingabeaufforderung, Mozilla) getestet und die Datei wird korrekt übertragen, was zu der Annahme führt, dass die Lösung property-driven ist oder eine Einschränkung für die Objekte, die ich verwende.

Unten ist der Code, den ich aus einem Windows-Formular testen, die das Problem erzeugt.

Danke.

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

Antwort

0

Wenn Sie Dateinamen sind verketten URL für Web-Anfrage zu erstellen, Sie haben den Dateinamen zu entkommen percent-enconding verwenden, andernfalls Zeichen nach „#“ gelten als URL fragment stattdessen Teil des Dateinamens des Seins.

Ich empfehle, Funktion wie Uri.EscapeDataString() anstelle von Replace("#", "%23") zu verwenden, weil es alle anderen reservierten Zeichen (wie '@') ordnungsgemäß behandelt.

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

Wenn targetPath reservierte Zeichen enthalten könnte, müssen Sie es auch entkommen.

+0

Vielen Dank. Das habe ich gesucht. Sehr geschätzt. –