欢迎光临

木子屋

标题: FileStream复制文件注意事项

作者: dnawo

日期: 2009-08-11 11:09 AM

分类: Win编程

内容: 使用FileStream读取文件时，为避免将大文件一次性全部读取到内存中，我们经常会声明一个byte[]做为临时存储空间，然后循环读取内容：
复制内容到剪贴板 程序代码using (FileStream fs = File.OpenRead(path))
{
byte[] b = new byte[1024];
UTF8Encoding temp = new UTF8Encoding(true);
while (fs.Read(b, 0, b.Length) > 0)
{
Console.WriteLine(temp.GetString(b));
}
}
同理，在复制文件时我们也不希望将大文件一次性都读取到内存中，同样可以声明一个byte[]做为临时存储空间：
复制内容到剪贴板 程序代码public void CopyFile(string sourcepath, string destpath)
{
using (FileStream fs = new FileStream(sourcepath, FileMode.Open, FileAccess.Read))
{
using (FileStream fs2 = new FileStream(destpath, FileMode.Create, FileAccess.Write))
{
byte[] b = new byte[1024];
while (fs.Read(b, 0, b.Length) > 0)
{
fs2.Write(b, 0, b.Length);
}
}
}
}
问题来了，当最后一次读取不满1024字节时，byte数组的剩余项都为0，这样在写入时将致使新文件比原文件占用更多的空间：
只需将代码稍加修改即可：
复制内容到剪贴板 程序代码public void CopyFile(string sourcepath, string destpath)
{
using (FileStream fs = new FileStream(sourcepath, FileMode.Open, FileAccess.Read))
{
using (FileStream fs2 = new FileStream(destpath, FileMode.Create, FileAccess.Write))
{
byte[] b = new byte[1024];
int l = 0;
while ((l = fs.Read(b, 0, b.Length)) > 0)
{
fs2.Write(b, 0, l);
}
}
}
}

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.730 ms

返回

标题: FileStream复制文件注意事项

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.730 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.777 ms

返回