Max*_*Max 3 c# stream filestream
无论我阅读 TXT 文件还是 XML 文件,我总是看到“额外”信息添加到我保存到磁盘的文件中。我们首先执行以下操作:
FileStream fs = new FileStream(fileMoverFile.SourcePath, FileMode.Open, FileAccess.Read);
Run Code Online (Sandbox Code Playgroud)
然后我们分配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();
}
Run Code Online (Sandbox Code Playgroud)
当我打开保存到磁盘的文件时,我看到额外的信息,这些信息基本上是同一个文件的一些内容与一些不属于该文件的其他信息重复。很奇怪。
什么可能导致这种情况?
您需要写入bytesRead字节,而不是bufferSize字节:
int bytesRead = fileStream.Read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
outputStream.Write(buffer, 0, bytesRead); // Change this here
Run Code Online (Sandbox Code Playgroud)
现在,当您到达输入流的末尾时,您可能写入的数据多于读取的数据,这将导致文件末尾出现“额外垃圾”。
话虽如此,如果您的目标只是复制流,则可以使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3432 次 |
| 最近记录: |