我想删除我文件中的空白行,我想使用下面的代码。
private void ReadFile(string Address)
{
var tempFileName = Path.GetTempFileName();
try
{
//using (var streamReader = new StreamReader(Server.MapPath("~/Images/") + FileName))
using (var streamReader = new StreamReader(Address))
using (var streamWriter = new StreamWriter(tempFileName))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
if (!string.IsNullOrWhiteSpace(line))
streamWriter.WriteLine(line);
}
}
File.Copy(tempFileName, Address, true);
}
finally
{
File.Delete(tempFileName);
}
Response.Write("Completed");
}
但问题是我的文件太大(8条紫胶线)因此需要花费大量时间。那么有没有其他方法可以更快地完成它?
答案 0 :(得分:3)
我不是做一个ReadLine(),而是用StreamReader.ReadToEnd()把整个文件加载到内存中,然后做一行。换行(“\ n \ n”,“\ n”)然后做streamWrite.Write(行)到文件。这样就没有太多的颠簸,无论是内存还是磁盘,都在继续。
答案 1 :(得分:1)
最佳解决方案可能完全取决于磁盘类型 - 固态硬盘和旋转防锈表现不同。您当前的方法优于史蒂夫的答案,即当数据仍然从磁盘上传出时能够进行处理(例如将文本数据编码为二进制)。 (通过缓冲和后台IO,这里存在很多潜在的异步性。)绝对值得尝试这两种方法。 (显然你的方法也使用更少的内存。)
但是,您的代码的一个方面肯定不是最理想的:创建结果的副本。你不需要这样做。您可以使用文件移动,这样可以提高效率,假设它们全部在同一个驱动器中。为确保您不会丢失数据,您可以执行两项操作并删除:
看来这就是File.Replace
为您所做的事情,这使得它变得相当简单,并且还保留了原始元数据。
如果在第一次移动后出现问题,您将离开,而不是"正确的"来自旧版或新版的文件,但您可以检测到该文件并使用备份文件名进行下次读取。
当然,如果这是作为Web请求的一部分发生的,您可能希望在后台任务中执行所有处理 - 处理800,000行文本可能需要比您真正想要Web请求更长的时间采取...