5
4

3 に答える 3

2

この質問への回答から判断するStreamReaderと、ファイル リストを取得するために使用しているのエンコーディングを指定する必要がある場合があります。デフォルトは UTF8 ですが、次のように他のエンコーディングを使用できます。

reader = New StreamReader(ftp.GetResponse().GetResponseStream(), System.Text.Encoding.Unicode)

エンコーディングの問題が発生したときは、通常、文字化けした文字列をコピーして、文字の 16 進値を表示できるエディターに貼り付け、そこからエンコーディングを計算します。

上記の文字列には、文字 00F3 が含まれています。あなたのプロフィールはあなたがスペインにいると言っています。これら2つをGoogleの助けを借りてまとめると、FTPサーバーはコードページ1145であるスペイン語のEBCDICを使用していると推測されます。

reader = New StreamReader(ftp.GetResponse().GetResponseStream(), System.Text.Encoding.GetEncoding(1145))

編集: F3 は、拡張 ASCII を含むほとんどのエンコーディングで鋭い o であることがわかりました。私の検索で出てきたのは EBCDIC です。

于 2013-04-01T03:39:27.647 に答える
0

いくつかの特殊文字を使用してみましたが、以下はうまく機能します。listDir 関数はリストを作成します... 試してみて、私たちに知らせてください...

 Public Shared Function DownloadFileFromServer(fileUri As Uri) As Boolean

    If fileUri.Scheme <> Uri.UriSchemeFtp Then
        Return False
    End If
    ' Get the object used to communicate with the server.
    Dim request As New WebClient()


    request.Credentials = New NetworkCredential("user", "pass")
    Try
        Dim newFileData As Byte() = request.DownloadData(fileUri.ToString())
        Dim fileString As String = System.Text.Encoding.UTF8.GetString(newFileData)
        'do something with data
        Console.WriteLine(fileString)
    Catch e As WebException
        Console.WriteLine(e.ToString())
    End Try
    Return True
End Function

Public Shared Function listDir() As Boolean

    Dim request As FtpWebRequest = DirectCast(WebRequest.Create("ftp://www.yourftpsite.com/docs/"), FtpWebRequest)
    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails

    request.Credentials = New NetworkCredential("user", "pass")

    Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse)

    Dim responseStream As Stream = response.GetResponseStream()
    Dim reader As New StreamReader(responseStream)

    Dim dirlist As String() = Nothing
    dirlist = reader.ReadToEnd().Split(New String() {vbCr & vbLf}, StringSplitOptions.RemoveEmptyEntries)

    For Each dirLine As String In dirlist

        Dim dirData As String = dirLine

        ' Parse date
        Dim lineDate As String = dirData.Substring(0, 17)
        Dim dateTime__1 As DateTime = DateTime.Parse(lineDate)
        dirData = dirData.Remove(0, 24)

        ' check if line is a directory
        Dim dir As String = dirData.Substring(0, 5)
        Dim isDirectory As Boolean = dir.Equals("<dir>", StringComparison.InvariantCultureIgnoreCase)
        dirData = dirData.Remove(0, 5)
        dirData = dirData.Remove(0, 10)

        ' get the filename
        If Not isDirectory Then
            Dim fileName As String = dirData

            'the actual filename
            Console.WriteLine("name= " & fileName)

        End If
    Next

    reader.Close()
    response.Close()

    Return True

End Function
于 2013-03-28T01:10:16.250 に答える
0

私の場合、コードはアクセント付きのラテン文字でうまく機能するように見えました.# ハッシュ/数字記号ほどラテン文字のエンコーディングではありませんでした。

これに対する回答は、Gary Yang (マイクロソフト オンライン コミュニティ サポート)から得られました。重要なのは、Uri.EscapeDataString() を使用することでした。彼の答えはうまくいきませんでしたが、敬意を表して以下に示します。

ファイルパスをエンコードすることをお勧めします。次のコードを参照してください。

string FTPFilePath = "ftp://myserverip.com/Beatles #1 Hits/Help document.mp3";
if ((FTPFilePath).IndexOf("#") > -1){
 targetUri = new Uri(Uri.EscapeDataString(FTPFilePath));
}
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(targetUri);

ここに私の作業バージョンがあります:

Dim ftpFilePath = "ftp://myserverip.com/Beatles #1 Hits/Help document.mp3"

Dim parsedUri = new Uri(ftpFilePath)
Dim scheme = parsedUri.Scheme
Dim host = parsedUri.Host
Dim port = parsedUri.Port
Dim pathThatMightHaveHashSigns = ftpFilePath.Replace(String.Format("{0}://{1}", scheme, host), String.Empty)

'Dim targetUri = new Uri(Uri.EscapeDataString(ftpFilePath))
' The above line would throw a UriFormatException "Invalid URI: The format of the URI could not be determined."

Dim targetUri = new UriBuilder(scheme, host, port, pathThatMightHaveHashSigns).Uri
Dim request = CType(WebRequest.Create(targetUri), FtpWebRequest)

...そしてC#の場合:

var ftpFilePath = "ftp://myserverip.com/Beatles #1 Hits/Help document.mp3";

var parsedUri = new Uri(ftpFilePath);
var scheme = parsedUri.Scheme;
var host = parsedUri.Host;
var port = parsedUri.Port;
var pathThatMightHaveHashSigns = ftpFilePath.Replace(String.Format("{0}://{1}", scheme, host), String.Empty);

//var targetUri = new Uri(Uri.EscapeDataString(ftpFilePath));
// The above line would throw a UriFormatException "Invalid URI: The format of the URI could not be determined."

var targetUri = new UriBuilder(scheme, host, port, pathThatMightHaveHashSigns).Uri;
targetUri.Dump();
于 2016-01-19T05:04:36.350 に答える