Cred ca este a 2-a oara când întâlnesc aceasta cerința in decurs de câteva săptămâni.
Se da un stream și o locație unde trebuie salvat, se cere să se salveze conținutul la stream in locația data. Din păcate API-ul de .NET nu ne permite să facem acest lucru doar dintr-un apel.
O soluție propusa este următoarea:
Se da un stream și o locație unde trebuie salvat, se cere să se salveze conținutul la stream in locația data. Din păcate API-ul de .NET nu ne permite să facem acest lucru doar dintr-un apel.
O soluție propusa este următoarea:
/// <summary>
/// Save the stream to the given location.
/// </summary>
/// <param name="stream">The stream.</param>
/// <param name="filePath">The file path where is saved.</param>
/// <param name="blockSize">The size of the buffer(in kB)</param>
public static void SaveStream(this Stream stream,String filePath,SeekOrigin seekOrigin=SeekOrigin.Begin,int blockSize=1)
{
//Set the poinder to the begin of the stream.
if(stream.CanSeek && seekOrigin==SeekOrigin.Begin)
{
stream.Seek(0, SeekOrigin.Begin);
}
//Removed the existing file.
if (File.Exists(CommandLineArguments.Instance.File))
{
File.Delete(CommandLineArguments.Instance.File);
}
//Save the stream to the given location.
using (var streamWrite = File.Create(CommandLineArguments.Instance.File))
{
byte[] buffer = new byte[1024*blockSize];
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
streamWrite.Write(buffer, 0, read);
}
}
}
Iar un exemplu de utilizare:Stream stream=...;
stream.Save("d:/a.txt");
In funcție de necesitați acest exemplu se poate extinde. Din păcate nu putem să facem un extension method pe File deoarece este o clasa statica.
File.Create suprascrie fisierul daca exista, nu e nevoie sa il stergi inainte. Prefer sa folosesc File.Open, in loc de File.Create, pentru ca File.Create foloseste by default FileShare.None, ceea ce inseamna ca nu pot sa ma uit prin fisier in timp ce el este scris sau nu il pot copia daca s-a oprit in vreo exceptie si totusi vreau sa pastrez continutul deja scris.
ReplyDeleteApoi merita mentionat ca in .Net 4.0 Stream are o metoda CopyTo(anotherStream) care ar simplifica mult metoda.