我想允许用户使用任何标准后缀(例如 TB、MB、GB)输入文件大小
我想以一种可以将它们与文件夹大小进行比较的方式获取值。
我们的想法是让一个程序在文件夹超过一定大小时发出警告,大小由用户输入的字符串决定。
.net 框架中是否有任何内置的东西允许我解析诸如 1.5TB
、400GB
、1.9GB
和 0.5KB
?
最佳答案
这是一个很好的简单 Interpreter 候选者.
像这样的代码是一个简单的开始,您可能需要处理更多情况,并考虑大小写的差异(例如,Gb
与 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)。更改为 long 以适应大尺寸。
关于c# - 将 "1.5TB", "500MB"转换成单个文件大小单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7332669/