尝试在 Visual Studio 项目中将文件大小转换为可读 - 如何与我现有的代码结合使用

Posted

技术标签:

【中文标题】尝试在 Visual Studio 项目中将文件大小转换为可读 - 如何与我现有的代码结合使用【英文标题】:Trying to convert file size to readable in a Visual Studio project - how to combine with my existing code 【发布时间】:2016-06-26 17:17:16 【问题描述】:

我正在使用 Visual Studio 模型,并且我有一个“下载”页面,其中显示了文件名、文件大小和链接。但是,我正在尝试将文件大小转换为可读格式。我已经找到了几种方法来做到这一点,但我认为我遇到困难的地方是如何将它合并到我已经使用的代码中。例如,我已经有一个 FileSize 变量,所以我想将它合并到转换代码中。这是模型本身的现有代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Web.Hosting;

namespace SupportToolkit.Models

public class DataClassesModel

    public List<FileNames> GetFiles()
    

        List<FileNames> lstFiles = new List<FileNames>();
        DirectoryInfo dirInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/Files"));

        int i = 0;
        foreach (var item in dirInfo.GetFiles())
        

            lstFiles.Add(new FileNames()
            
                FileId = i + 1,
                FileName = item.Name,
                FileSize = item.Length,
                FilePath = dirInfo.FullName + @"\" + item.Name,
                FileExtension = item.Extension
            );
            i = i + 1;
        

        return lstFiles;
    




public class FileNames

    public int FileId  get; set; 
    public string FileName  get; set; 
    public long FileSize  get; set; 
    public string FilePath  get; set; 
    public string FileExtension  get; set; 
    

我想在此处添加一些代码来转换为 KB、MB、GB 等 - 我有一个想法,但不知道如何将其合并到我已有的内容中。这是我要转换的示例:

public static string FileSizeFormat(this long FileSize)
    
        double size = FileSize;
        int index = 0;
        for (; size > 1024; index++)
            size /= 1024;
        return size.ToString("0.00 " + new[]  "B", "KB", "MB", "GB", "TB" [index]);
    

任何帮助将不胜感激!我对此很陌生,只是坚持如何将这两件事融合在一起。 :)

谢谢。

让我也添加 Index.html 中使用的代码,也许这将有助于完成循环。我想弄清楚如何让格式化的文件大小显示在这个页面上。谢谢。

@using SupportToolkit.Models
@model IEnumerable<SupportToolkit.Models.FileNames>

@
ViewBag.Title = "Index";


<h2>Downloads</h2>

<hr />

<table>
<tr>
    <th>
        File Name
    </th>

    <th>
        File Size
    </th>
</tr>

@foreach (var item in Model)

    <tr >
        <td>
            @Html.DisplayFor(modelItem => item.FileName)
        </td>

        <td>
            @Html.DisplayFor(modelItem => item.FileSize)
        </td>

        <td>
            <p style="text-indent: 5em;">
                @Html.ActionLink("Download", "Download", new  id = item.FileId )
            </p>
        </td>
    </tr>

在这种情况下,我使用@Html.DisplayFor(modelItem => item.FileSize) 来显示文件大小。但这不包括格式。我如何将其设为格式化文件大小(人类可读)?

【问题讨论】:

How do I get a human-readable file size in bytes abbreviation using .NET?的可能重复 我了解如何获取人类可读的文件大小。我不明白如何将其合并到我已经使用的代码中。我很清楚地解释了这一点。事实上,我相信您发布的链接是我获得用于如何转换文件大小的代码的地方。这不是问题。问题是我正在寻找一些关于如何将此方法与我已经编写的代码相结合的指导。我发布了我现有的代码和我想用于转换的方法。问题是我如何一起使用它们? 特别是 - 我如何获取我已经使用的“FileSize = item.length”并将其转换为人类可读的?我当前的代码将如何合并转换? @LilithGoddess:不清楚你在问什么。显然,使用FileSize(即item.Length)参数调用FileSizeFormat 将返回您要求的string 表示。但是不可能说出你真正想用这个字符串做什么。将其转储到控制台?保存到文本文件?或者您想在FileNames 中添加一个新的string 属性,以便GetFiles 将字符串值分配给该属性?通常,您在最后(打印/渲染之前)进行格式化。顺便提一句。更好的类名应该是FileName,单数。 另外,您不需要连接dirInfo.FullName + @"\" + item.Name,只需使用item.FullName,它已经包含完整路径。 【参考方案1】:

看起来您将FileSizeFormat 定义为long 的扩展方法。

在这种情况下,您可以调用,例如,lstFiles[0].FileSize.FileSizeFormat(),它会返回可读的字符串。

不要忘记添加using XXX,其中XXX 是您定义FileSizeFormat 方法的命名空间。

考虑将FileSizeFormat 重命名为ToReadableFileSize()。它会让你的代码更“可读”——lstFiles[0].FileSize.ToReadableFileSize()

【讨论】:

谢谢 - 所以,我的问题是。目前,在 index.html 中,我在表格中显示文件大小的方式是使用“@Html.DisplayFor(modelItem => item.FileSize)”。这工作正常,除了不包含格式。所以我想我可以使用“@Html.DisplayFor(modelItem => item.FileSize.FileSizeFormat)”来包含格式,但这不会编译。我做错了吗?【参考方案2】:

想通了,经过很长时间。想我会发布,以便其他人可以从中学习,可能具有相同的学习曲线。 ;)

我只更改了一行代码。在模型本身中:

FileSize = item.Length,

现在改为:

FileSize = FileSizeFormat(item.Length),

我还从公共字符串中删除了静态,因为它不需要。

没有什么需要改变的。就是这样。谢谢!

【讨论】:

以上是关于尝试在 Visual Studio 项目中将文件大小转换为可读 - 如何与我现有的代码结合使用的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2008 中将目录添加到 CAB 项目

如何在 Visual Studio 中将 common/inc 文件夹添加到 CUDA 项目?

如何在 Microsoft Visual Studio Express 2012 for Web 中将文件夹添加到项目中?

如何在 Visual Studio 2019 中将 WCF 服务添加到 .NET Core 项目?

在 Visual Studio c++ 项目中将 Eigen 外部库放在哪里?

在 Visual Studio 16.6 中将仅内容包导入 DotNet Core 3.1 项目