创建文本文件并将数据写入其中

除了在网站中使用数据库外,还可以处理文件。 例如,可以将文本文件用作存储网站的数据的简单方法。 (用于存储数据的文本文件有时称为 平面文件 。) 文本文件的格式可能不同,例如 .txt .xml .csv( 逗号分隔值) 。

如果要将数据存储在文本文件中,可以使用 File.WriteAllText 该方法指定要创建的文件以及要写入到其中的数据。 在此过程中,你将创建一个页面,其中包含一个简单窗体,其中包含三 input 个元素 (名字、姓氏和电子邮件地址) 和 “提交 ”按钮。 当用户提交表单时,你将在文本文件中存储用户的输入。

  • 创建名为 App_Data 的新文件夹(如果尚不存在)。

  • 在网站的根目录中,创建名为 UserData.cshtml 的新文件。

  • 将现有内容替换为以下内容:

    var result = ""; if (IsPost) var firstName = Request["FirstName"]; var lastName = Request["LastName"]; var email = Request["Email"]; var userData = firstName + "," + lastName + "," + email + Environment.NewLine; var dataFile = Server.MapPath("~/App_Data/data.txt"); File.WriteAllText(@dataFile, userData); result = "Information saved."; <!DOCTYPE html> <title>Write Data to a File</title> </head> <form id="form1" method="post"> <table> <td>First Name:</td> <td><input id="FirstName" name="FirstName" type="text" /></td> <td>Last Name:</td> <td><input id="LastName" name="LastName" type="text" /></td> <td>Email:</td> <td><input id="Email" name="Email" type="text" /></td> <td></td> <td><input type="submit" value="Submit"/></td> </table> @if(result != ""){ <p>Result: @result</p> </form> </body> </html>

    HTML 标记使用三个文本框创建窗体。 在代码中 IsPost ,可以使用该属性来确定页面是否已在开始处理之前提交。

    第一个任务是获取用户输入并将其分配给变量。 然后,代码将单独的变量的值连接成一个逗号分隔的字符串,然后存储在不同的变量中。 请注意,逗号分隔符是一个字符串, (“,”) ,因为你正字面上将逗号嵌入到要创建的大字符串中。 在连接在一起的数据的末尾,添加 Environment.NewLine 。 这会 (换行符) 添加换行符。 使用所有这些串联创建的内容是如下所示的字符串:

    David,Jones,davidj@contoso.com
    

    (结尾处有一个不可见的换行符。)

    然后,创建一个变量 (dataFile) ,其中包含要存储数据的文件的位置和名称。 设置位置需要一些特殊的处理。 在网站中,最好在代码中引用绝对路径,例如 web 服务器上的文件 C:\Folder\File.txt 。 如果移动网站,绝对路径将错误。 此外,对于托管站点 (而不是在你自己的计算机上,) 你甚至不知道编写代码时的正确路径是什么。

    但有时 (,对于编写文件) 确实需要一个完整的路径。 解决方案是使用 MapPath 对象的方法 Server 。 这会返回网站的完整路径。 若要获取网站根路径,用户 (~ 操作员) 重新呈现网站的虚拟根 MapPath目录。 (还可以将子文件夹名称(如 ~/App_Data/)传递给该子文件夹,以获取该子文件夹的路径。) 然后,可以将其他信息连接到该方法返回的任何信息,以便创建完整的路径。 在此示例中,添加文件名。 (有关如何使用 Razor Syntax.) 的 ASP.NET 网页编程简介中的文件和文件夹路径的详细信息

    该文件保存在 App_Data 文件夹中。 此文件夹是 ASP.NET 中用于存储数据文件的特殊文件夹,如 ASP.NET 网页站点中使用数据库简介中所述。

    对象 WriteAllText 的方法 File 将数据写入文件。 此方法采用两个参数:名称 (包含要写入的文件的路径) ,以及要写入的实际数据。 请注意,第一个参数的名称具有作为 @ 前缀的字符。 这告知 ASP.NET 你提供逐字字符串文本,并且不应以特殊方式解释“/”等字符。 (有关详细信息,请参阅使用 Razor Syntax.) ASP.NET Web 编程简介

    为了使代码将文件保存在 App_Data 文件夹中,应用程序需要对该文件夹具有读写权限。 在开发计算机上,这通常不是问题。 但是,将站点发布到托管提供商的 Web 服务器时,可能需要显式设置这些权限。 如果在托管提供商的服务器上运行此代码并收到错误,请与托管提供商联系,了解如何设置这些权限。

    将数据追加到现有文件

    在前面的示例中,你用于 WriteAllText 创建一个文本文件,该文件中只有一段数据。 如果再次调用该方法并向其传递相同的文件名,则会完全覆盖现有文件。 但是,创建文件后,通常需要将新数据添加到文件末尾。 可以使用对象的方法File执行此操作AppendAllText

  • 在网站中,创建 UserData.cshtml 文件的副本,并将复制 UserDataMultiple.cshtml 命名。

  • 将打开 <!DOCTYPE html> 标记前的代码块替换为以下代码块:

    var result = ""; if (IsPost) var firstName = Request["FirstName"]; var lastName = Request["LastName"]; var email = Request["Email"]; var userData = firstName + "," + lastName + "," + email + Environment.NewLine; var dataFile = Server.MapPath("~/App_Data/data.txt"); File.AppendAllText (@dataFile, userData); result = "Information saved.";

    此代码在上一个示例中进行了一个更改。 它使用方法,而不是使用WriteAllTextthe AppendAllText方法。 方法类似,不同之处在于 AppendAllText 将数据添加到文件末尾。 与 一样 WriteAllTextAppendAllText 如果该文件尚不存在,则创建该文件。

  • 在浏览器中运行页面。

  • 输入字段的值,然后单击“ 提交”。

  • 添加更多数据并再次提交表单。

  • 返回到项目,右键单击项目文件夹,然后单击“ 刷新”。

  • 打开 data.txt 文件。 它现在包含刚输入的新数据。

    从文件读取和显示数据

    即使不需要将数据写入文本文件,有时也可能需要从一个文本文件中读取数据。 为此,可以再次使用该 File 对象。 可以使用 File 对象单独读取每行 (用换行符分隔) 或读取单个项,无论它们是如何分隔的。

    此过程演示如何读取和显示在上一个示例中创建的数据。

  • 在网站的根目录中,创建名为 DisplayData.cshtml 的新文件。

  • 将现有内容替换为以下内容:

    var result = ""; Array userData = null; char[] delimiterChar = {','}; var dataFile = Server.MapPath("~/App_Data/data.txt"); if (File.Exists(dataFile)) { userData = File.ReadAllLines(dataFile); if (userData == null) { // Empty file. result = "The file is empty."; else { // File does not exist. result = "The file does not exist."; <!DOCTYPE html> <title>Reading Data from a File</title> </head> <h1>Reading Data from a File</h1> @result @if (result == "") { @foreach (string dataLine in userData) { @foreach (string dataItem in dataLine.Split(delimiterChar)) { <li>@dataItem</li > </body> </html>

    代码首先使用此方法调用将前面示例中创建的文件读取到名为的 userData变量中:

    File.ReadAllLines(dataFile)
    

    要执行此操作的代码位于语句中 if 。 如果要读取文件,最好先使用 File.Exists 该方法来确定文件是否可用。 该代码还会检查文件是否为空。

    页面的正文包含两 foreach 个循环,一个循环嵌套在另一个循环中。 外部 foreach 循环一次从数据文件获取一行。 在这种情况下,行由文件中的换行符定义,即每个数据项都位于自己的行上。 外部循环在有序列表<ol> (<li>元素) 内创建一个新项 (元素) 。

    内部循环将每个数据行拆分为 (字段) 使用逗号作为分隔符的项。 (基于上一个示例,这意味着每行都包含三个字段,即名字、姓氏和电子邮件地址,每个字段用逗号分隔。) 内部循环还会创建一个 <ul> 列表,并为数据行中的每个字段显示一个列表项。

    该代码演示如何使用两种数据类型:一个数组和 char 数据类型。 由于该方法以数组的形式返回数据,因此 File.ReadAllLines 需要数组。 数据类型 char 是必需的, Split 因为该方法返回 array 每个元素的类型 char。 (有关数组的信息,请参阅使用 Razor Syntax.) ASP.NET Web 编程简介

  • 在浏览器中运行页面。 将显示为前面的示例输入的数据。

    显示 Microsoft Excel Comma-Delimited 文件中的数据

    可以使用 Microsoft Excel 将电子表格中包含的数据保存为逗号分隔的文件, (.csv 文件) 。 执行此操作时,该文件以纯文本形式保存,而不是以 Excel 格式保存。 电子表格中的每个行都用文本文件中的换行符分隔,每个数据项用逗号分隔。 可以使用上一示例中所示的代码通过更改代码中的数据文件的名称来读取 Excel 逗号分隔的文件。

    若要从网站中删除文件,可以使用该方法 File.Delete 。 此过程演示如何让用户从图像文件夹中删除图像 (.jpg文件) (如果他们知道文件的名称)。

    重要 在生产网站中,通常限制允许谁对数据进行更改。 有关如何设置成员身份以及如何授权用户在网站上执行任务的信息,请参阅将安全和成员身份添加到 ASP.NET 网页站点

  • 在网站中创建名为 映像的子文件夹。

  • 将一个或多个 .jpg 文件复制到 图像 文件夹中。

  • 在网站的根目录中,创建名为 FileDelete.cshtml 的新文件。

  • 将现有内容替换为以下内容:

    bool deleteSuccess = false; var photoName = ""; if (IsPost) { photoName = Request["photoFileName"] + ".jpg"; var fullPath = Server.MapPath("~/images/" + photoName); if (File.Exists(fullPath)) File.Delete(fullPath); deleteSuccess = true; <!DOCTYPE html> <title>Delete a Photo</title> </head> <h1>Delete a Photo from the Site</h1> <form name="deletePhoto" action="" method="post"> <p>File name of image to delete (without .jpg extension): <input name="photoFileName" type="text" value="" /> <p><input type="submit" value="Submit" /></p> </form> @if(deleteSuccess) { @photoName deleted! </body> </html>

    此页面包含一个表单,用户可以在其中输入图像文件的名称。 它们未输入 .jpg 文件扩展名;通过限制如下所示的文件名,有助于防止用户删除网站上的任意文件。

    该代码读取用户输入的文件名,然后构造完整的路径。 若要创建路径,代码使用方法) 、图像文件夹名称、用户提供的名称以及文本字符串“.jpg”返回Server.MapPath的当前网站路径 (。

    若要删除该文件,代码将调用 File.Delete 该方法,并向其传递刚刚构造的完整路径。 在标记的末尾,代码显示一条确认消息,指出文件已删除。

  • 在浏览器中运行页面。

  • 输入要删除的文件的名称,然后单击“ 提交”。 如果删除了该文件,则会在页面底部显示该文件的名称。

    允许用户上传文件

    帮助 FileUpload 程序允许用户将文件上传到您的网站。 下面的过程演示如何允许用户上传单个文件。

  • 如之前未添加 ASP.NET 网页网站中的帮助程序中所述,请将 ASP.NET Web 帮助程序库添加到网站。

  • App_Data 文件夹中,新建一个文件夹并将其命名为 UploadedFiles

  • 在根目录中,创建一个名为 FileUpload.cshtml 的新文件。

  • 将页面中的现有内容替换为以下内容:

    @using Microsoft.Web.Helpers;
        var fileName = "";
        if (IsPost) {
            var fileSavePath = "";
            var uploadedFile = Request.Files[0];
            fileName = Path.GetFileName(uploadedFile.FileName);
            fileSavePath = Server.MapPath("~/App_Data/UploadedFiles/" +
              fileName);
            uploadedFile.SaveAs(fileSavePath);
    <!DOCTYPE html>
        <title>FileUpload - Single-File Example</title>
        </head>
        <h1>FileUpload - Single-File Example</h1>
        @FileUpload.GetHtml(
            initialNumberOfFiles:1,
            allowMoreFilesToBeAdded:false,
            includeFormTag:true,
            uploadText:"Upload")
        @if (IsPost) {
            <span>File uploaded!</span><br/>
        </body>
    </html>
    

    页面的正文部分使用 FileUpload 帮助程序创建可能熟悉的上传框和按钮:

    FileUpload 帮助程序设置的属性指定要上传文件的单个框,并且希望提交按钮读取 “上传”。 (本文稍后将添加更多框。)

    当用户单击“ 上传”时,页面顶部的代码将获取文件并将其保存。 Request通常用于从窗体字段获取值的对象还有一个Files数组,其中包含文件 (或已上传的文件) 。 可以从数组中的特定位置获取单个文件,例如获取第一个上传的文件、获取 Request.Files[0]、获取第二个文件、获取 Request.Files[1]文件等。 (请记住,在编程中,计数通常从零开始。)

    提取上传的文件时,请在此处 (将其放入变量中, uploadedFile) 以便可以对其进行操作。 若要确定上传的文件的名称,只需获取其 FileName 属性。 但是,当用户上传文件时, FileName 包含用户的原始名称,其中包括整个路径。 它可能如下所示:

    C:\Users\Public\Sample.txt

    不过,你不希望所有路径信息,因为这是用户计算机上的路径,而不是服务器的路径。 只需 (Sample.txt) 实际文件名。 可以使用此方法 Path.GetFileName 将文件从路径中剥离出来,如下所示:

    Path.GetFileName(uploadedFile.FileName)
    

    对象 Path 是一个实用工具,其中包含许多方法,可用于条带路径、组合路径等。

    获取上传文件的名称后,可以生成一个新路径,以便在网站中存储上传的文件。 在本例中,将合并 Server.MapPath文件夹名称 (App_Data/UploadedFiles) ,以及新剥离的文件名以创建新路径。 然后,可以调用上传文件 SaveAs 的方法以实际保存文件。

  • 在浏览器中运行页面。

  • 单击“ 浏览 ”,然后选择要上传的文件。

    “浏览”按钮旁边的文本框将包含路径和文件位置。

  • 单击“上载” 。

  • 在网站中,右键单击项目文件夹,然后单击“ 刷新”。

  • 打开 UploadedFiles 文件夹。 上传的文件位于文件夹中。

    允许用户上传多个文件

    在前面的示例中,允许用户上传一个文件。 但是,可以使用 FileUpload 帮助程序一次上传多个文件。 对于上传照片等方案来说,这很方便,其中一次上传一个文件很繁琐。 (你可以阅读有关在 ASP.NET 网页 Site 中使用图像上传照片的信息。) 本示例演示如何让用户一次上传两张照片,尽管你可以使用相同的技术上传更多。

  • 如尚未在 ASP.NET 网页网站中安装帮助程序中所述,将 ASP.NET Web 帮助程序库添加到网站。

  • 创建名为 FileUploadMultiple.cshtml 的新页面。

  • 将页面中的现有内容替换为以下内容:

    @using Microsoft.Web.Helpers;
      var message = "";
      if (IsPost) {
          var fileName = "";
          var fileSavePath = "";
          int numFiles = Request.Files.Count;
          int uploadedCount = 0;
          for(int i =0; i < numFiles; i++) {
              var uploadedFile = Request.Files[i];
              if (uploadedFile.ContentLength > 0) {
                  fileName = Path.GetFileName(uploadedFile.FileName);
                  fileSavePath = Server.MapPath("~/App_Data/UploadedFiles/" +
                    fileName);
                  uploadedFile.SaveAs(fileSavePath);
                  uploadedCount++;
           message = "File upload complete. Total files uploaded: " +
             uploadedCount.ToString();
    <!DOCTYPE html>
        <head><title>FileUpload - Multiple File Example</title></head>
        <form id="myForm" method="post"
           enctype="multipart/form-data"
           action="">
        <h1>File Upload - Multiple-File Example</h1>
        @if (!IsPost) {
            @FileUpload.GetHtml(
                initialNumberOfFiles:2,
                allowMoreFilesToBeAdded:true,
                includeFormTag:true,
                addText:"Add another file",
                uploadText:"Upload")
        <span>@message</span>
        </form>
    </body>
    </html>
    

    在此示例中, FileUpload 页面正文中的帮助程序配置为允许用户默认上传两个文件。 由于 allowMoreFilesToBeAdded 设置为 true,帮助程序会呈现一个链接,允许用户添加更多上传框:

    若要处理用户上传的文件,代码使用与上一示例中所用的相同基本技术, 从 Request.Files 中获取文件,然后保存该文件。 (包括需要执行的各种操作才能获取正确的文件名和路径。) 这次创新是用户可能会上传多个文件,并且你不知道太多。 若要了解,可以获取 Request.Files.Count

    借助此数字,可以循环访问 Request.Files、依次提取每个文件并保存该文件。 如果要循环通过集合的已知次数,可以使用循环 for ,如下所示:

    for(int i =0; i < numFiles; i++) {
        var uploadedFile = Request.Files[i];
        if (uploadedFile.ContentLength > 0) {
            fileName = Path.GetFileName(uploadedFile.FileName);
        // etc.
    

    该变量 i 只是一个临时计数器,它将从零变为设置的任何上限。 在这种情况下,上限是文件数。 但是,由于计数器从零开始,就像在 ASP.NET 中计数方案一样,上限实际上小于文件计数。 (如果上传了三个文件,则计数为零到 2.)

    uploadedCount 变量汇总成功上传和保存的所有文件。 此代码用于说明预期文件可能无法上传的可能性。

  • 在浏览器中运行页面。 浏览器显示页面及其两个上传框。

  • 选择要上传的两个文件。

  • 单击“ 添加其他文件”。 该页显示新的上传框。

  • 单击“上载” 。

  • 在网站中,右键单击项目文件夹,然后单击“ 刷新”。

  • 打开 UploadedFiles 文件夹以查看已成功上传的文件。

    在 ASP.NET 网页网站中使用图像

    导出到 CSV 文件

  •