用C#写的FTP访问程序,要访问并获取一个FTP上的文件。
FTP服务器的系统是UNIX Type: L8 Version: BSD-44。
访问程序如下:
1 /// <summary>
2 /// 检查文件是否存在,如果存在则返回文件列表
3 /// </summary>
4 /// <param name="dirUrl">FTP路径</param>
5 /// <param name="anonymous">是否匿名访问</param>
6 /// <param name="ftpUserName">FTP用户名</param>
7 /// <param name="ftpPwd">FTP密码</param>
8 /// <returns></returns>
9 private string[] GetFileList(string dirUrl, bool anonymous, string ftpUserName, string ftpPwd)
10 {
11 StringBuilder result = new StringBuilder();
12
13 FtpWebRequest reqFTP;
14 try
15 {
16 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(dirUrl));
17 reqFTP.UseBinary = true;
18 if (anonymous)
19 {
20 reqFTP.Credentials = CredentialCache.DefaultNetworkCredentials;
21 }
22 else
23 {
24 reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
25 }
26
27 reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
28 //reqFTP.Timeout = 10000;
29 //reqFTP.ReadWriteTimeout = 30000;
30 IData_MonitorLogFacade facade = BeanObjects.DataMonitorLogFacade;
31
32 using (WebResponse response = reqFTP.GetResponse())
33 {
34 using (StreamReader reader = new StreamReader(response.GetResponseStream()))
35 {
36 string line = reader.ReadLine();
37 while (line != null)
38 {
39 string pattern = dataDir.RetrievePattern.Replace(".", @"\.").Replace("*", ".*").Replace("?", ".?");
40 Regex reg = new Regex(pattern);
41 if (reg.IsMatch(line))
42 {
43 if (!facade.FileExists(line, dataDir.Id))
44 {
45 result.Append(dirUrl + "/" + line);
46 result.Append("\n");
47 }
48 }
49 line = reader.ReadLine();
50 }
51 // to remove the trailing '\n'
52 if (result.Length > 0)
53 result.Remove(result.ToString().LastIndexOf('\n'), 1);
54 reader.Close();
55 }
56 response.Close();
57 }
58 if (result.Length <= 0) return new string[0];
59
60 return result.ToString().Split('\n');
61 }
62 catch (Exception ex)
63 {
64 throw ex;
65 }
66 }
用来访问WINDOWS系统的FTP就没有问题,我有个放在Godaddy的windows的.net空间,测试通过,可以获取到文件列表。但当我测试客户的FTP服务器时,却总提示文件路径不存在。检查后发现,这个UNIX上的FTP路径会更改,比如FTP路径是这样
ftp://123.123.123.123/data/latest
使用FlashFXP的ftp工具来访问,可以正常的登录和操作,但却发现在FlashFXP界面中,显示的路径不跟原来的一样。FlashFXP不会显示前面的IP地址,所以
正常情况下路径应该显示为:/data/latest
但实际上却是显示: /rmsvc/rsch/data/latest
很明显就是这个UNIX上的FTP服务器对路径做了跳转,导致我的程序无法访问到正确路径。但是我不可以写死FTP路径,应该路径可能会有变动。
请问高手,该如何解决?
还有个奇怪的问题,就算我在浏览器,或者文件夹的地址栏中直接输入:
ftp://123.123.123.123/data/latest
也一样不能访问,没有弹出输入用户密码的对话框。
为什么用LeapFTP,FlashFTP就可以访问呢。