3

这是我从 ftp 服务器下载文件的代码,但它区分大小写匹配.. 你能帮我下载不匹配大小写吗?

例如:如果我尝试下载“6Gt6hh.xml”但 ftp 服务器中的现有文件是“6GT6hh.Xml”。它不是用我的代码下载的,你能帮帮我吗?

private void Download(string file, ServerCredentials FtpCdrl, string DayOfYear, string dest, string ab)
    {
        try
        {
            string uri = "ftp://" + FtpCdrl.Host + "/" + FtpCdrl.DirPath.Replace("\\", "/") + "/" + DayOfYear + "/" + file;
            Uri serverUri = new Uri(uri);
            if (serverUri.Scheme != Uri.UriSchemeFtp)
            {
                return;
            }
            if (!Directory.Exists(dest))
                Directory.CreateDirectory(dest);
            if (!Directory.Exists(dest + "\\" + ab))
                Directory.CreateDirectory(dest + "\\" + ab);
            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + FtpCdrl.Host + "/" + FtpCdrl.DirPath.Replace("\\", "/") + "/" + DayOfYear + "/" + file));
            reqFTP.Credentials = new NetworkCredential(FtpCdrl.UID, FtpCdrl.Pwd);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.Proxy = null;
            reqFTP.UsePassive = false;
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream responseStream = response.GetResponseStream();


            FileStream writeStream = new FileStream(dest + "\\" + ab + "\\" + file, FileMode.Create);
            int Length = 2048;
            Byte[] buffer = new Byte[Length];
            int bytesRead = responseStream.Read(buffer, 0, Length);

            while (bytesRead > 0)
            {
                writeStream.Write(buffer, 0, bytesRead);
                bytesRead = responseStream.Read(buffer, 0, Length);
            }
            status("File Downloaded Successfully: .\\" + ab + "\\" + file, Color.Green);
            writeStream.Close();
            response.Close();
            failed = 0;
        }
        catch (WebException wEx)
        {
            failed++;
            status("[Download Error]" + wEx.Message, Color.Red);
            if (failed < 3)
                Download(file, FtpCdrl, DayOfYear, dest, ab);
        }
        catch (Exception ex)
        {
            status("[Download Error]" + ex.Message, Color.Red);
        }
    }
 public class ServerCredentials
    {
        public string Host, UID, Pwd, DirPath;
        public int Pst;
        public string Mail;
        public string facility;
        public string Batchextn;

        public ServerCredentials(string _Host1, string _DirPath1, string _Uid1, string _Pwd1, string _Mail, int _Pst1, string _facility, string _batchextn)
        {
            Host = _Host1;
            UID = _Uid1;
            Pwd = _Pwd1;
            DirPath = _DirPath1;
            Pst = _Pst1;
            Mail = _Mail;
            facility = _facility;
            Batchextn = _batchextn;
        }
    }
    public List<ServerCredentials> Svr = new List<ServerCredentials>();
4

1 回答 1

3

Uris 区分大小写,由服务器决定是否允许对文件进行不区分大小写的访问。即传统上大多数 HTTP 服务器忽略 Uri 的路径部分的大小写,但通常尊重查询部分的大小写。

在您的情况下,您访问的 FTP 服务器似乎强制文件名的大小写匹配(对于 Unix/Linux 服务器很常见),甚至可能有多个具有不同大小写的文件。

正确的实现是首先列出内容,然后从文件列表中选择文件名。如何:使用 FTP 列出目录内容一文涵盖了此步骤。

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/");
request.Credentials = new NetworkCredential ("anonymous","janeDoe@contoso.com");
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

using(var response = (FtpWebResponse)request.GetResponse())
  using(var responseStream = response.GetResponseStream())
    using(var reader =  new StreamReader(responseStream))
    {
      Console.WriteLine(reader.ReadToEnd());
    }
于 2013-03-05T06:40:03.873 回答