2017-02-07 14 views
0

編集:私は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(); 
     } 

答えて

0

は、Web要求のURLを作成するために、ファイル名を連結している、 「#」の後に文字がURL fragmentの代わりに、ファイル名の一部であると考えられています。

Replace("#", "%23")の代わりにUri.EscapeDataString()のような機能を使用することをお勧めします。これは、他のすべての予約文字( '@'など)を適切に処理するためです。予約文字が含まれている可能性が

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

TARGETPATH 場合、あなたもそれをエスケープする必要があるかもしれません。

+0

ありがとうございます。それが私が探していたものです。とても有難い。 –

関連する問題