0

我必须在 vb .NET 中以编程方式删除文件的最后一个空行。有时,只有一个空行,有时是两个(但永远不会更多)。

我现在使用这些代码行:

fs = New FileStream(Fic_source, FileMode.Open, FileAccess.ReadWrite)
fs.Seek(-50, SeekOrigin.End)
Dim strEOF As String = New StreamReader(fs).ReadToEnd()
strEOF = strEOF .Replace(vbCrLf, "")  ' 
strEOF = strEOF .Replace("\r", "")    ' Removes every CR / LF / CRLF from the end of the file
strEOF = strEOF .Replace("\n", "")    '
strEOF = String.Concat(strEOF , vbCrLf) ' adds an empty line to finish the file correctly

但我似乎无法弄清楚如何将我的流中的最后 50 个字符替换为 strEOF,有人知道吗?

4

4 回答 4

0

如果是我,我会考虑更改文件的长度 - 在文件流上尝试 SetLength。冲洗并关闭。

于 2013-02-12T19:40:24.687 回答
0

由于您已将流中的数据转换为字符串,因此使用正则表达式来匹配和替换多个 CRLF 的可能性。正则表达式处理器的一个细微差别是您可以告诉它从右到左工作。因此从最后开始。

以下模式将从末尾 ($) 开始,并仅用一个 CRLF 替换任何 CRLF(最多两组,或四个字符为 \r\n)。如果没有,那么即使它与任何字符集都不匹配,它也会在最后替换(实际上放入)一个。

dim data = string.Format("ABC{0}DEF{0}{0}", Environment.NewLine) ' 2 CRLF
dim pattern = "[\r\n]{0,4}$"

Console.WriteLine( "***{0}***", Regex.Replace( data, pattern, Environment.NewLine, RegexOptions.RightToLeft) )

data = string.Format("ABC{0}DEF", Environment.NewLine) ' No CRLFS

Console.WriteLine( "***{0}***", Regex.Replace( data, pattern, Environment.NewLine, RegexOptions.RightToLeft) )

' Console Results (note that *** is following each DEF
'***ABC
'DEF
'***
'***ABC
'DEF
'***
于 2013-02-12T20:03:20.867 回答
0

你想从你拥有的文本的末尾修剪 CR 和 LF,所以你不妨使用 .TrimEnd:

strEOF = strEOF.TrimEnd(vbCrLf.ToArray) & vbCrLf
于 2013-02-12T20:19:03.537 回答
0
Dim objWriter As New StreamWriter(FileNamewithPath, True)
objWriter.NewLine = Chr(10) 'This works as ENTER on keyboard. This is optional.
objWriter.WriteLine("The text that is required to write")
'Loop it to get all the values you need to write.
'Before the last line. i.e. before your end loop - 1 step
objWriter.NewLine = "" 'add this
objWriter.WriteLine("last line to be written").
objWriter.Close()
于 2013-06-10T13:40:04.700 回答