0

我在一个 ftp 服务器上有多个文件。我不知道这些文件的名称,除了它们都是。xml 文件。如何使用 .Net 的 FtpWebRequest 以编程方式下载这些文件?

谢谢。

4

5 回答 5

2

很可能您必须发出一个列出所有文件的 Dir 命令,然后逐个下载文件。

这是有关获取目录列表的一些信息。

http://msdn.microsoft.com/en-us/library/ms229716.aspx

于 2009-12-11T21:11:45.370 回答
1

看一下ListDirectory函数。它相当于 FTP 中的 NLIST 命令。

于 2009-12-11T21:13:07.957 回答
0

您可能希望使用像这样的现有库,而不是编写自己的库。

于 2009-12-11T21:11:54.793 回答
0
FtpWebRequest __request = (FtpWebRequest)FtpWebRequest.Create(__requestLocation);
__request.Method = WebRequestMethods.Ftp.ListDirectory;

var __response = (FtpWebResponse)__request.GetResponse();
                        using (StreamReader __directoryList = new StreamReader(__response.GetResponseStream())) {
                            string ___line = __directoryList.ReadLine();
                            while (___line != null) {
                                if (!String.IsNullOrEmpty(___line)) { __output.Add(___line); }
                                ___line = __directoryList.ReadLine();
                            }

                            break;
                        }

获取目标文件...

FtpWebRequest __request = null;
FtpWebResponse __response = null;
byte[] __fileBuffer = null;
byte[] __outputBuffer = null;

__request = (FtpWebRequest)FtpWebRequest.Create(__requestLocation);
__request.Method = WebRequestMethods.Ftp.DownloadFile;

__response = (FtpWebResponse)__request.GetResponse();

using (MemoryStream __outputStream = new MemoryStream()) {
   using (Stream __responseStream = __response.GetResponseStream()) {
      using (BufferedStream ___outputBuffer = new BufferedStream(__responseStream)) {
         __fileBuffer = new byte[BLOCKSIZE];
         int ___readCount = __responseStream.Read(__fileBuffer, 0, BLOCKSIZE);

         while (___readCount > 0) {
            __outputStream.Write(__fileBuffer, 0, ___readCount);
            ___readCount = __responseStream.Read(__fileBuffer, 0, BLOCKSIZE);
         }

         __outputStream.Position = 0;
         __outputBuffer = new byte[__outputStream.Length];
         //Truncate Buffer to only the specified bytes. Store into output buffer
         Array.Copy(__outputStream.GetBuffer(), __outputBuffer, __outputStream.Length);

         break;
      }
   }
}

try { __response.Close(); } catch { }
__request = null;
__response = null;

return __outputBuffer;

从我拥有的其他一些代码中提取出来,所以它可能不会直接编译和运行。

于 2009-12-11T21:24:16.920 回答
-1

不知道FtpWebRequest是不是严格要求。如果您可以使用第三方组件,则以下代码将完成您的任务:

// create client, connect and log in 
Ftp client = new Ftp();
client.Connect("ftp.example.org");
client.Login("username", "password");

// download all files in the current directory which matches the "*.xml" mask 
// at the server to the 'c:\data' directory 
client.GetFiles("*.xml", @"c:\data", FtpBatchTransferOptions.Default);

client.Disconnect();

该代码使用Rebex FTP,可在此处下载

免责声明:我参与了该产品的开发。

于 2010-02-26T17:58:09.833 回答