gpt4 book ai didi

c# - FileStream 添加 "extra"个字符到 TXT 文件

转载 作者:行者123 更新时间:2023-11-30 15:02:37 24 4
gpt4 key购买 nike

无论我读取 TXT 文件还是 XML 文件,我总是看到“额外”信息添加到我的文件中并保存到磁盘。我们首先执行以下操作:

FileStream fs = new FileStream(fileMoverFile.SourcePath, FileMode.Open, FileAccess.Read);

然后我们将 fs 分配给 Stream 类型的变量,我们将其传递给下面的函数:

private void SaveToDisk(Stream fileStream, string saveToPath)
{
if (!Directory.Exists(Path.GetDirectoryName(saveToPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(saveToPath));
}
FileStream outputStream = new FileInfo(saveToPath).OpenWrite();
const int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int bytesRead = fileStream.Read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
outputStream.Write(buffer, 0, bufferSize);
bytesRead = fileStream.Read(buffer, 0, bufferSize);
}
outputStream.Close();
}

当我打开保存到磁盘的文件时,我看到了额外的信息,这些信息基本上是同一文件的某些内容与一些不属于该文件的其他信息重复出现。很奇怪。

这可能是什么原因造成的?

最佳答案

您需要写入bytesRead 字节,而不是bufferSize 字节:

int bytesRead = fileStream.Read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
outputStream.Write(buffer, 0, bytesRead); // Change this here

现在,当您到达输入流的末尾时,您写入的数据可能比读入的数据多,这将导致文件末尾出现“额外的垃圾”。

也就是说,如果您的目标只是复制流,您可以只使用 Stream.CopyTo (前提是您使用的是 .NET 4+)。这完全避免了读/写循环,并大大简化了您的代码:

private void SaveToDisk(Stream fileStream, string saveToPath)
{
if (!Directory.Exists(Path.GetDirectoryName(saveToPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(saveToPath));
}
using(FileStream outputStream = new FileInfo(saveToPath).OpenWrite())
{
fileStream.CopyTo(outputStream);
}
}

关于c# - FileStream 添加 "extra"个字符到 TXT 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com