更改 FileStream 写入编码类型

3
这是我的代码:
public static string DownloadFile(string FtpUrl, string FileNameToDownload,
                   string userName, string password, string tempDirPath)
    {
        string ResponseDescription = "";
        string PureFileName = new FileInfo(FileNameToDownload).Name;
        string DownloadedFilePath = tempDirPath + "/" + PureFileName;
        string downloadUrl = String.Format("{0}/{1}", FtpUrl, FileNameToDownload);
        FtpWebRequest req = (FtpWebRequest)FtpWebRequest.Create(downloadUrl);
        req.Method = WebRequestMethods.Ftp.DownloadFile;
        req.Credentials = new NetworkCredential(userName, password);
        req.UseBinary = true;
        req.Proxy = null;
        try
        {
            FtpWebResponse response = (FtpWebResponse)req.GetResponse();
            Stream stream = response.GetResponseStream();
            byte[] buffer = new byte[2048];
            FileStream fs = new FileStream(DownloadedFilePath, FileMode.Create);
            int ReadCount = stream.Read(buffer, 0, buffer.Length);
            while (ReadCount > 0)
            {

              fs.Write(buffer, 0, ReadCount);
              ReadCount = stream.Read(buffer, 0, buffer.Length);
            }
            ResponseDescription = response.StatusDescription;
            fs.Close();

            stream.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        return ResponseDescription;
    }

}

这段代码从FTP服务器下载文件并将其写入服务器上的特定路径,但保存的文件编码不是UTF-8。 我想要将文件的编码类型更改为UTF-8。 我必须使用StreamReader吗? 我该如何修改这段代码?

2个回答

3

理论上,下面的代码应该可以工作,但它取决于响应流是否能够与流读取器一起使用。 使用不同编码进行写入很容易,你可以使用基于textwriter的streamwriter来代替filestream。然而,你无法直接写入字节,因为你必须写入格式正确的文本。为此,必须使用适当的原始编码将字节转换为文本(Char缓冲区)。

    char[] buffer = new char[2048]; //or 1024 if you want to keep the same block size
    using (var reader = new StreamReader(stream, Encoding.Unicode)) // <= Or whatever encoding the orignal is
    {
        using (var tw = new StreamWriter(DownloadedFilePath, false, Encoding.UTF8)) //streamwriter instead of filestream
        {                
            while (true)
            {
                int ReadCount = reader.Read(buffer, 0, buffer.Length);
                if (ReadCount == 0) break;
                tw.Write(buffer, 0, ReadCount);                    
            }
            ResponseDescription = response.StatusDescription;
            stream.Close();
            tw.Close();
        }
    }

如果StreamReader存在问题,您也可以先下载字节,然后在已下载的字节上使用StreamReader。

0

你可以用StreamWriter来包装它:

try
    {
        FtpWebResponse response = (FtpWebResponse)req.GetResponse();
        Stream stream = response.GetResponseStream();
        byte[] buffer = new byte[2048];
        var sw = new StreamWriter( new FileStream(DownloadedFilePath, FileMode.Create),
    Encoding.UTF8);
        int ReadCount = stream.Read(buffer, 0, buffer.Length);
        while (ReadCount > 0)
        {

           sw.Write(buffer, 0, ReadCount);
          ReadCount = stream.Read(buffer, 0, buffer.Length);
        }
        ResponseDescription = response.StatusDescription;
        sw.Close();

        stream.Close();
    }

希望它能有所帮助

你可以在这里看看:https://stackoverflow.com/answer


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接