从 ftp 在 gridview 上显示数据 查看更多:C#ASP.NET
Posted
技术标签:
【中文标题】从 ftp 在 gridview 上显示数据 查看更多:C#ASP.NET【英文标题】:Display data on gridview from ftp See more: C#ASP.NET 【发布时间】:2022-01-18 15:07:42 【问题描述】:我在 ftp 服务器上有太多文件,我想在数据 gridview 中显示而不保存或下载并按日期排序,我不知道该怎么做。这些文件是 .qrt,但我可以在 excel 或记事本中打开它们。 我这样做了,但来自 sql db,但从未使用过 ftp 这些文件的名称带有日期。
我在 C# 中使用 asp.net Web 表单。
知道我该怎么做。 非常感谢先进
【问题讨论】:
您想在 gridview 中显示来自 Ftp 的文件内容?您是否尝试将文件读取为文本文件并将数据转换为 c# 类集合? 这是一个 FTP 文件夹,还是典型的文件夹层次结构?但是,是的,网格视图是显示 ftp 文件列表的好方法——而且非常简单。但是,如果这是像文件夹一样的 ftp 文件视图,那么树视图控件当然要好得多——因为这样您就可以显示像 UI 这样的文件资源管理器。但是,哪种选择取决于您希望如何显示文件 - 那么这是一个包含文件的 FTP 文件夹(网格视图很好),还是您需要/想要显示像 UI 这样的文件夹?但是,这里的答案是肯定的 - 我们只需要知道这是您希望显示的一个文件夹还是多个文件夹。 它的 1 个 FTP 文件夹,你能给我一个树视图的代码示例,因为我以前从未使用过它。非常感谢 【参考方案1】:如前所述,这很容易。但是,您没有提及您是要显示一堆文件夹,还是只显示一个 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();
您也可以/可以按日期排序 - 因为我们将日期列定义为日期时间。
【讨论】:
非常感谢您花时间和精力帮助我。它工作正常,但是当我添加最后一个代码时,它给了我:索引超出了数组的范围。在这一行: OneRow["Size"] = scols[4];但如果我不添加这段代码,它会像你提到的那样工作。 如前所述,尝试仅将网格填充为一个 collum。您必须编写代码来解析该“目录”列表 - 如前所述,这将因服务器而异。因此,我删除了所有空格(双空格),直到它们全部消失。然后我根据每列之间的“,”进行拆分。然后我拔出专栏 - 你必须调整和使用那部分代码,因为如前所述,“直接”列出你的服务器的内容会有所不同,并且与我的示例有所不同。因此,您甚至可以调试打印,获取目录列表的一行 - 将其放入文本文件中 - 并将其解析出来。 换句话说,从那一行文件夹列表中提取并解析出来是很棘手的 - 你必须手动编写代码并弄清楚你的文件夹列表的工作方式和外观与我的例子。代替拆分,您还可以采用开始 + 结束字符位置,并以这种方式解析 - 它们重新固定列表大小 - 但如前所述,您看到的内容无疑会与我的直接列表有所不同。这是一个文本解析问题。如果您愿意,我也可以发布树视图版本 - 这可能会更好,因为树视图允许复选框选择文件。 我真的非常感谢你!你太棒了!以上是关于从 ftp 在 gridview 上显示数据 查看更多:C#ASP.NET的主要内容,如果未能解决你的问题,请参考以下文章
使用asp.net gridview和c#从phpmyadmin数据库显示图像
从数据库中提取数据时如何在 GridView 中仅显示日期? C#
C#中gridview已经读取了Excel的数据,但是在主界面上未显示出来
DevExpress 中gridview怎么才能新建一行?其中的gridview1.AddNewRecord()方法没用