SBu*_*ris 297 .net c# using file
我正在做一个项目.我必须比较两个文件的内容,看看它们是否精确匹配.
在进行大量错误检查和验证之前,我的初稿是:
DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory + "\\TestArea\\");
FileInfo[] files = di.GetFiles(filename + ".*");
FileInfo outputFile = files.Where(f => f.Extension == ".out").Single<FileInfo>();
FileInfo expectedFile = files.Where(f => f.Extension == ".exp").Single <FileInfo>();
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
{
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
{
while (!(outFile.EndOfStream || expFile.EndOfStream))
{
if (outFile.ReadLine() != expFile.ReadLine())
{
return false;
}
}
return (outFile.EndOfStream && expFile.EndOfStream);
}
}
Run Code Online (Sandbox Code Playgroud)
有嵌套using
语句似乎有点奇怪.
有一个更好的方法吗?
SLa*_*aks 532
执行此操作的首选方法是仅{
在最后一个using
语句后放置一个左括号,如下所示:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
{
///...
}
Run Code Online (Sandbox Code Playgroud)
Gav*_*n H 135
如果对象属于同一类型,则可以执行以下操作
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()),
expFile = new StreamReader(expectedFile.OpenRead()))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
jas*_*son 33
当IDisposable
s是相同类型时,您可以执行以下操作:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()),
expFile = new StreamReader(expectedFile.OpenRead()) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
MSDN页面上using
有关于此语言功能的文档.
无论IDisposable
s是否属于同一类型,您都可以执行以下操作:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamWriter anotherFile = new StreamReader(anotherFile.OpenRead()))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
Bot*_*000 17
如果你不介意在using块之前声明你的using块的变量,你可以在同一个using语句中声明它们.
Test t;
Blah u;
using (IDisposable x = (t = new Test()), y = (u = new Blah())) {
// whatever...
}
Run Code Online (Sandbox Code Playgroud)
这样,x和y只是IDisposable类型的占位符变量,供使用的块使用,并且在代码中使用t和u.我以为我会提到.
小智 11
从C# 8.0 开始,您可以使用using 声明。
using var outFile = new StreamReader(outputFile.OpenRead());
using var expFile = new StreamReader(expectedFile.OpenRead());
while (!(outFile.EndOfStream || expFile.EndOfStream))
{
if (outFile.ReadLine() != expFile.ReadLine())
{
return false;
}
}
return (outFile.EndOfStream && expFile.EndOfStream);
Run Code Online (Sandbox Code Playgroud)
这将在变量范围的末尾处理 using 变量,即在方法的末尾。
如果要有效地比较文件,请不要使用StreamReader,然后不需要使用 - 您可以使用低级流读取来提取数据缓冲区以进行比较.
您还可以首先比较文件大小等内容,以快速检测不同的文件,以节省您自己必须读取的所有数据.
using语句使用IDisposable接口,因此另一个选项可能是创建某种类型的实现IDisposable的复合类,并且引用了通常放在using语句中的所有IDisposable对象.这样做的缺点是你必须首先在范围之外声明你的变量,以便它们在需要比其他一些建议所需的更多代码行的使用块中更有用.
Connection c = new ...;
Transaction t = new ...;
using (new DisposableCollection(c, t))
{
...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,DisposableCollection的构造函数是一个params数组,因此您可以根据需要输入.
你也可以说:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
{
...
}
Run Code Online (Sandbox Code Playgroud)
但有些人可能会发现难以阅读.顺便说一句,作为您问题的优化,为什么在逐行前检查文件大小是否相同?
您可以使用逗号将多个一次性对象组合在一个using语句中:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()),
expFile = new StreamReader(expectedFile.OpenRead()))
{
}
Run Code Online (Sandbox Code Playgroud)
您可以省略除最内层以外的所有括号:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
{
while (!(outFile.EndOfStream || expFile.EndOfStream))
{
if (outFile.ReadLine() != expFile.ReadLine())
{
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这比使用其他人所建议的几种相同类型更干净,但我相信很多人会认为这是令人困惑的
另外,如果您已经知道路径,则无需扫描目录。
相反,我会推荐这样的东西:
string directory = Path.Combine(Environment.CurrentDirectory, @"TestArea\");
using (StreamReader outFile = File.OpenText(directory + filename + ".out"))
using (StreamReader expFile = File.OpenText(directory + filename + ".exp"))
{
//...
Run Code Online (Sandbox Code Playgroud)
Path.Combine
将向路径添加文件夹或文件名,并确保路径和名称之间正好有一个反斜杠。
File.OpenText
将打开一个文件并StreamReader
一次性创建一个。
通过在字符串前添加 @ 前缀,您可以避免转义每个反斜杠(例如,@"a\b\c"
)
它没什么奇怪的. using
是代码块完成后确保处理对象的简便方法.如果您的外部块中有一个一次性物体,内部块需要使用,这是完全可以接受的.
编辑:输入太慢以显示合并代码示例.+1给其他人.
在这种情况下,为了增加清晰度,因为每个连续语句都是单个语句(而不是块),所以可以省略所有括号:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
while (!(outFile.EndOfStream || expFile.EndOfStream))
if (outFile.ReadLine() != expFile.ReadLine())
return false;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
81765 次 |
最近记录: |