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();
}
Vielen Dank. Das habe ich gesucht. Sehr geschätzt. –