使用FtpWebRequest下载文件时获取文件名而不是内容

西里德

我正在尝试编写一个可以从人口普查局的TIGER FTP站点下载shapefile的工具,该站点位于:ftp : //ftp2.census.gov/geo/tiger/TIGER2015/TRACT我能够很好地列出文件,但是当我尝试下载文件时,我得到的字符串只是文件名,而不是文件内容本身。代码如下。

    private static T FtpRequest<T, TReader>(string url, string method, Func<TReader, T> responseAction) where TReader : IDisposable {
        var request = (FtpWebRequest)WebRequest.Create(url);
        request.Method = WebRequestMethods.Ftp.ListDirectory;
        request.Credentials = new NetworkCredential("anonymous", "anonymous");
        request.UseBinary = true;
        request.UsePassive = true;
        var response = (FtpWebResponse)request.GetResponse();
        using(var responseStream = response.GetResponseStream())
        using(var reader = (TReader)Activator.CreateInstance(typeof(TReader), responseStream)) {
            return responseAction(reader);
        }
    }

    private static IList<string> ListDirectory(string url) {
        return FtpRequest(url,
                          WebRequestMethods.Ftp.ListDirectory,
                          (StreamReader reader) => reader.ReadAllLines()
                                                         .Select(file => new Uri(new Uri(url), new Uri(file, UriKind.Relative)).AbsoluteUri)
                                                         .ToArray());
    }

    private static byte[] DownloadBinaryFile(string url) {
        // NOTE: following code works in 4.6, but not 3.5
        //using(var client = new WebClient()) {
        //  return client.DownloadData(url);
        //}

        // this code returns file name as string in both 4.6 and 3.5
        return FtpRequest(url,
                          WebRequestMethods.Ftp.DownloadFile,
                          (BinaryReader reader) => {
                              using(var memoryStream = new MemoryStream()) {
                                  var buffer = new byte[2048];

                                  for(;;) {
                                      var bytesRead = reader.Read(buffer, 0, buffer.Length);
                                      if(bytesRead == 0)
                                          break;

                                      memoryStream.Write(buffer, 0, bytesRead);
                                  }

                                  memoryStream.Position = 0;
                                  return memoryStream.GetBuffer();
                              }
                          });
    }

    internal static void Main(string[] args) {
        var baseUrl = "ftp://ftp2.census.gov/geo/tiger/TIGER2015/TRACT";

        foreach(var file in ListDirectory(baseUrl)) {
            Console.WriteLine("Downloading: {0}", file);
            var contents = DownloadBinaryFile(file);
            using(var zipStream = new MemoryStream(contents))
            using(var zipFile = ZipFile.Read(zipStream)) {
                foreach(var entry in zipFile) {
                    Console.WriteLine(" -> {0}", entry.FileName);
                    //using(var entryReader = entry.OpenReader()) {

                    //}
                }
            }
        }

        Console.ReadKey();
    }

如果使用WebClient,.NET 3.5失败并显示550错误,但.NET 4.6正常工作。相关代码已在上面注释掉。

人口普查站点有点挑剔,因此他们的站点很可能在做奇怪的事情。这就是为什么我提供URL的原因,以防任何比我了解更多FTP知识的人都可以诊断出服务器故障。

马丁·普里克里(Martin Prikryl)

在您FtpRequestWebRequestMethods.Ftp.ListDirectory方法中,即使下载也要始终使用该方法。因此,您实际上是在“列出”文件,这就是为什么在响应中获得文件名的原因。

您必须使用该WebRequestMethods.Ftp.DownloadFile方法下载文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用FtpWebRequest下载文件时获取文件名而不是内容

来自分类Dev

使用Java下载文件时如何获取原始文件名

来自分类Dev

使用ServiceStack HttpResult下载文件:如何为下载的内容指定文件名?

来自分类Dev

下载文件时如何设置文件名?

来自分类Dev

下载文件时不知道文件名

来自分类Dev

在FTP中使用正则表达式获取文件名以下载文件

来自分类Dev

使用PowerShell读取下载文件的文件名

来自分类Dev

使用WebClient下载时获取原始文件名

来自分类Dev

下载文件,文件名

来自分类Dev

下载文件,文件名

来自分类Dev

如何使用PowerShell的FtpWebRequest类从FTP服务器下载文件名中包含井号/井号'#'的文件

来自分类Dev

从NSURLSession下载文件名

来自分类Dev

在Angular 8中从web.api下载文件时从服务器获取文件名

来自分类Dev

使用内容处置下载文件时出现问题

来自分类Dev

下载文件之前如何从链接中获取文件名?

来自分类Dev

从AngularJS的服务器下载文件时如何更改文件名

来自分类Dev

在Internet Explorer中直接打开下载文件时出现文件名问题

来自分类Dev

从闪亮的应用程序下载文件时如何设置您选择的文件名

来自分类Dev

是否可以使用bash从服务器获取mp3的下载文件名?

来自分类Dev

如何下载文件名已更改的文件?

来自分类Dev

使用 javascript 变量作为文件名以使用 href 下载文件

来自分类Dev

如何使用PowerShell中的文件内容获取文件名

来自分类Dev

如何在url中传递长文件名并使用php函数下载文件?

来自分类Dev

使用URL /标题文件名的PowerShell Core下载文件

来自分类Dev

c#尝试使用WebClient下载文件名中包含特殊字符的文件

来自分类Dev

使用ftplib下载文件名中带有空格的文件

来自分类Dev

从WebView下载文件返回HTML内容而不是实际文件

来自分类Dev

下载并使用htmlunit获取原始文件名?

来自分类Dev

下载时获取文件内容

Related 相关文章

  1. 1

    使用FtpWebRequest下载文件时获取文件名而不是内容

  2. 2

    使用Java下载文件时如何获取原始文件名

  3. 3

    使用ServiceStack HttpResult下载文件:如何为下载的内容指定文件名?

  4. 4

    下载文件时如何设置文件名?

  5. 5

    下载文件时不知道文件名

  6. 6

    在FTP中使用正则表达式获取文件名以下载文件

  7. 7

    使用PowerShell读取下载文件的文件名

  8. 8

    使用WebClient下载时获取原始文件名

  9. 9

    下载文件,文件名

  10. 10

    下载文件,文件名

  11. 11

    如何使用PowerShell的FtpWebRequest类从FTP服务器下载文件名中包含井号/井号'#'的文件

  12. 12

    从NSURLSession下载文件名

  13. 13

    在Angular 8中从web.api下载文件时从服务器获取文件名

  14. 14

    使用内容处置下载文件时出现问题

  15. 15

    下载文件之前如何从链接中获取文件名?

  16. 16

    从AngularJS的服务器下载文件时如何更改文件名

  17. 17

    在Internet Explorer中直接打开下载文件时出现文件名问题

  18. 18

    从闪亮的应用程序下载文件时如何设置您选择的文件名

  19. 19

    是否可以使用bash从服务器获取mp3的下载文件名?

  20. 20

    如何下载文件名已更改的文件?

  21. 21

    使用 javascript 变量作为文件名以使用 href 下载文件

  22. 22

    如何使用PowerShell中的文件内容获取文件名

  23. 23

    如何在url中传递长文件名并使用php函数下载文件?

  24. 24

    使用URL /标题文件名的PowerShell Core下载文件

  25. 25

    c#尝试使用WebClient下载文件名中包含特殊字符的文件

  26. 26

    使用ftplib下载文件名中带有空格的文件

  27. 27

    从WebView下载文件返回HTML内容而不是实际文件

  28. 28

    下载并使用htmlunit获取原始文件名?

  29. 29

    下载时获取文件内容

热门标签

归档