如前所述,这很容易。但是,您没有提及您是要显示一堆文件夹,还是只显示一个 FTP 文件夹中的文件?
如前所述,如果您有一堆文件夹,那么非常容易使用树视图来显示这种层次结构类型设置。但是,对于一个文件夹?当然,GridView 是一个不错的选择。
你可以说用这个:
我们的标记是这样的:
<asp:GridView ID="GridView1" runat="server"
CssClass="table" Width="20%"></asp:GridView>
好的,我们的代码是这样的:
using System.Net;
using System.IO;
所以,对于页面加载,我们有这个:
const string UserId = "User Name here";
const string Password = "Password here";
const string fRoot = "ftp://ftp.mycoolwebsite.com/test";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadGrid();
}
void LoadGrid()
{
DataTable MyFiles = new DataTable();
MyFiles.Columns.Add("File", typeof(string));
List<string> fList = GetFtpFiles();
foreach (string sFile in fList)
{
DataRow OneRow = MyFiles.NewRow();
OneRow["File"] = sFile;
MyFiles.Rows.Add(OneRow);
}
GridView1.DataSource = MyFiles;
GridView1.DataBind();
}
List<string> GetFtpFiles()
{
FtpWebRequest ftpR = (FtpWebRequest)WebRequest.Create(fRoot);
ftpR.Credentials = new NetworkCredential(UserId, Password);
ftpR.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = ftpR.GetResponse() as FtpWebResponse;
StreamReader sread = new StreamReader(response.GetResponseStream());
List<string> myDir = new List<string>();
string oneLine = sread.ReadLine();
while (!string.IsNullOrEmpty(oneLine))
{
myDir.Add(oneLine);
oneLine = sread.ReadLine();
}
sread.Close();
return myDir;
}
现在的输出是这样的:
现在,如果我们想要文件大小?这是一个问题,因为理论上一旦我们有了文件列表,我们就可以编写代码来“请求”每个文件大小 - 这很痛苦,但更糟糕的是很多请求。另一种方式,我们可以改变这个:
ftpR.Method = WebRequestMethods.Ftp.ListDirectory;
到:
ftpR.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
上面将返回文件信息,非常类似于旧式 DOS 文件列表。
当我们在上面运行时,我们现在得到这个:
所以,如果我们想按文件名排序,我们必须解析出文件名和日期。这不是太难。如前所述,另一种方法是为每个文件“请求”文件大小和日期 - 但这是额外的代码,但更糟糕的是对 ftp 服务器的大量点击。
并且文件列表的样式与 Web 服务器(可能是 windows 或 linux)不一致,但我们可以将上面的内容解析为列 - 然后我们可以按日期或文件名排序。
解析?哎呀,这行得通:
void LoadGrid()
{
DataTable MyFiles = new DataTable();
MyFiles.Columns.Add("Date", typeof(DateTime));
MyFiles.Columns.Add("Size", typeof(int));
MyFiles.Columns.Add("File", typeof(string));
List<string> fList = GetFtpFiles();
foreach (string s in fList)
{
DataRow OneRow = MyFiles.NewRow();
string sRow = s;
while (sRow.Contains(" "))
sRow = sRow.Replace(" ", " ");
sRow = sRow.Replace(" ", ",");
string[] scols = sRow.Split(',');
OneRow["Size"] = scols[4];
OneRow["File"] = scols[8];
OneRow["Date"] = scols[7] + "-" + scols[6] + "-" + scols[5];
MyFiles.Rows.Add(OneRow);
}
GridView1.DataSource = MyFiles;
GridView1.DataBind();
}
现在我们得到了这个:
我们需要在网格中格式化 - 但至少现在,使用表格,您可以在绑定之前按日期或文件名对该表格进行排序,如下所示:
MyFiles.DefaultView.Sort = "File";
GridView1.DataSource = MyFiles;
GridView1.DataBind();
您也可以/可以按日期排序 - 因为我们将日期列定义为日期时间。