加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 将“1.5TB”,“500MB”转换为单个文件大小的单位

发布时间:2020-12-15 18:19:35 所属栏目:百科 来源:网络整理
导读:我想允许用户使用任何标准后缀(例如TB,MB,GB)输入文件大小 我希望以一种可以将它们与文件夹大小进行比较的方式获取值. 我们的想法是让一个程序在文件夹超过一定大小时发出警告,其大小由用户输入的字符串决定. .net框架中是否有任何内置允许我解析1.5TB,400GB
我想允许用户使用任何标准后缀(例如TB,MB,GB)输入文件大小

我希望以一种可以将它们与文件夹大小进行比较的方式获取值.

我们的想法是让一个程序在文件夹超过一定大小时发出警告,其大小由用户输入的字符串决定.

.net框架中是否有任何内置允许我解析1.5TB,400GB,1.9GB和0.5KB等字符串?

解决方法

这是一个简单的 Interpreter的好选择.

像这样的代码是一个简单的开始,你需要处理更多的情况,并考虑套管的差异(例如Gb vs GB).

首先是上下文和表达式的定义:

public class FileSizeContext
{
    private string input;
    private long output;

    public FileSizeContext(string input)
    {
        this.Input = input;
    }

    public string Input { get; set; }

    public long Output { get; set; }
}

public abstract class FileSizeExpression
{
    public abstract void Interpret(FileSizeContext value);
}

然后定义终端表达式,以及所有变体:

public abstract class TerminalFileSizeExpression : FileSizeExpression
{
    public override void Interpret(FileSizeContext value)
    {
        if(value.Input.EndsWith(this.ThisPattern()))
        {
            double amount = double.Parse(value.Input.Replace(this.ThisPattern(),String.Empty));
            var fileSize = (long)(amount*1024);
            value.Input = String.Format("{0}{1}",fileSize,this.NextPattern());
            value.Output = fileSize;
        }
    }
    protected abstract string ThisPattern();
    protected abstract string NextPattern();
}

public class KbFileSizeExpression : TerminalFileSizeExpression
{
    protected override string ThisPattern(){return "KB";}
    protected override string NextPattern() { return "bytes"; }
}
public class MbFileSizeExpression : TerminalFileSizeExpression
{
    protected override string ThisPattern() { return "MB"; }
    protected override string NextPattern() { return "KB"; }
}
public class GbFileSizeExpression : TerminalFileSizeExpression
{
    protected override string ThisPattern() { return "GB"; }
    protected override string NextPattern() { return "MB"; }
}
public class TbFileSizeExpression : TerminalFileSizeExpression
{
    protected override string ThisPattern() { return "TB"; }
    protected override string NextPattern() { return "GB"; }
}

然后你添加一个非终端表达式(这可以完成大部分工作):

public class FileSizeParser : FileSizeExpression
{
    private List<FileSizeExpression> expressionTree = new List<FileSizeExpression>()
                                                  {
                                                      new TbFileSizeExpression(),new GbFileSizeExpression(),new MbFileSizeExpression(),new KbFileSizeExpression()
                                                  };

    public override void Interpret(FileSizeContext value)
    {
        foreach (FileSizeExpression exp in expressionTree)
        {
            exp.Interpret(value);
        }
    }
}

最后,这是一种客户端代码:

var ctx = new FileSizeContext("10Mb");
var parser = new FileSizeParser();
parser.Interpret(ctx);
Console.WriteLine("{0} bytes",ctx.Output); // 10485760 bytes

实例:http://rextester.com/rundotnet?code=WMGOQ13650

编辑.从Mb改为MB(一个是官方MegaByte,另一个是MegaBit).将int更改为long以考虑大尺寸.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读