C# > Data Access > File I/O > FileStream and MemoryStream
Copying a File using FileStream and BufferedStream
This example demonstrates how to efficiently copy a file using FileStream in conjunction with BufferedStream to improve performance.
Introduction to BufferedStream
BufferedStream adds a buffer to another stream (like FileStream) to reduce the number of calls to the underlying stream or device. It can significantly improve performance when reading from or writing to slow streams like files, especially for small, frequent operations.
Code for Copying a File with BufferedStream
This code copies a file from a source path to a destination path. It uses FileStream to access the files and wraps each FileStream with a BufferedStream. A buffer of 4KB is used to read data from the source file in chunks and write it to the destination file. The Read method returns the number of bytes read, and the loop continues until the end of the source file is reached. Using BufferedStream significantly reduces the number of physical reads and writes to the disk, improving performance. The using statements ensure that all streams are properly closed and disposed of, even if an exception occurs. Finally, the temporary source file is deleted.
using System;
using System.IO;
public class FileCopyExample
{
public static void Main(string[] args)
{
string sourceFilePath = "source.txt"; // Replace with your source file
string destinationFilePath = "destination.txt"; // Replace with your destination file
try
{
// Create a dummy source file for demonstration
File.WriteAllText(sourceFilePath, "This is the source file content.\n".PadRight(1024 * 1024, 'a')); // create a 1MB file
using (FileStream sourceStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read))
using (BufferedStream bufferedSource = new BufferedStream(sourceStream))
using (FileStream destinationStream = new FileStream(destinationFilePath, FileMode.Create, FileAccess.Write))
using (BufferedStream bufferedDestination = new BufferedStream(destinationStream))
{
byte[] buffer = new byte[4096]; // Use a buffer size of 4KB
int bytesRead;
while ((bytesRead = bufferedSource.Read(buffer, 0, buffer.Length)) > 0)
{
bufferedDestination.Write(buffer, 0, bytesRead);
}
Console.WriteLine("File copied successfully.");
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
finally
{
// Clean up the dummy source file
if (File.Exists(sourceFilePath))
{
File.Delete(sourceFilePath);
}
}
}
}
Concepts Behind the Snippet
This snippet leverages the concept of buffering to optimize file I/O operations. By reading and writing data in larger chunks, the number of system calls is reduced, leading to faster execution, especially for small, frequent reads and writes. FileStream provides the basic file access, while BufferedStream provides the performance optimization.
Real-Life Use Case Section
This technique is used extensively in applications that involve copying or transferring large files, such as backup utilities, file synchronization tools, and content delivery systems. Buffering is crucial for ensuring efficient data transfer and minimizing disk I/O operations.
Best Practices
using statement to ensure that streams are properly closed and disposed of, even if exceptions occur.FileNotFoundException or IOException, when working with files.
Interview Tip
Be prepared to discuss the benefits of using BufferedStream, the impact of buffer size, and the relationship between FileStream and BufferedStream. Understand the trade-offs between memory consumption and performance when choosing a buffer size.
When to Use Them
Use BufferedStream in conjunction with FileStream when you need to copy or transfer large files or when you need to perform many small, frequent read or write operations on a file.
Memory Footprint
The memory footprint of this code is determined primarily by the buffer size used. Larger buffer sizes can improve performance but will also consume more memory. FileStream itself has a minimal memory footprint as it streams data directly from disk.
Alternatives
File.Copy: A simple method for copying files, but it may not be as efficient as using FileStream and BufferedStream for large files.
Pros and Cons
Using BufferedStream with FileStream for copying
File.Copy, increased memory consumption due to the buffer.
FAQ
-
How does BufferedStream improve performance?
BufferedStreamimproves performance by reducing the number of calls to the underlying stream. Instead of reading or writing data one byte at a time, it reads or writes data in larger chunks, which reduces the overhead associated with each call. -
What is a good buffer size to use?
The optimal buffer size depends on the specific use case. A buffer size of 4KB (4096 bytes) is often a good starting point. Experiment with different buffer sizes to find the optimal value for your application. -
Can I use BufferedStream with other stream types?
Yes,BufferedStreamcan be used with any stream type that inherits from theStreamclass, such asNetworkStreamorMemoryStream.