c# - 将 "1.5TB", "500MB"转换成单个文件大小单位

标签 c# .net byte

我想允许用户使用任何标准后缀(例如 TB、MB、GB)输入文件大小

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

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

.net 框架中是否有任何内置的东西允许我解析诸如 1.5TB400GB1.9GB0.5KB ?

最佳答案

这是一个很好的简单 Interpreter 候选者.

像这样的代码是一个简单的开始,您可能需要处理更多情况,并考虑大小写的差异(例如,GbGB)。

您从上下文和表达式的定义开始:

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)。更改为 long 以适应大尺寸。

关于c# - 将 "1.5TB", "500MB"转换成单个文件大小单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7332669/

相关文章:

java - 使用 .equals() 比较两个字符串返回 False,但它们的字节数组相等

当索引 < 128 时,Java byte for 循环不会停止运行

java - 如何在java中将图像转换为字节数组?(不使用bufferedimage)

C#,如何将证书添加到 HttpClientHandler?

c# - 使用 C# 按值传递和按引用传递之间的区别

.net - 如何让 Entity Framework 在我新创建的实体上初始化集合?

c# - 如何将 XmlDocument 转换为数组 <byte>?

c# - 确定 ListboxItem 在 Canvas 中的位置?

c# - IE 11 打开旧的覆盖的 PDF 而不是新的 PDF?

c# - 如何正确关闭客户端代理(现有连接被远程主机强行关闭)?