zmniejszając linii kodu jest dość prosta tutaj (podczas gdy nadal pracuje z dowolnych strumieni, a nie tylko pliki):
using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
int byteRead;
while ((byteRead = fileStream.ReadByte()) != -1)
{
memoryStream.WriteByte(byteRead);
}
return memoryStream.ToArray();
}
Oczywiście jest to dużo bardziej wydajny czytać w buforze niż czytać bajt na raz, ale to zmniejsza liczbę wypowiedzi (jako don Trzeba zadeklarować zarówno bufor, jak i zmienna przechowująca wartość zwrotną ze strumienia). Wywołanie MemoryStream.ToArray()
jest prostsze niż czytanie do nowo utworzonej tablicy.
Korzystanie z bufora jest jednak przyjemniejsze. Zauważ, że naprawdę nie trzeba BinaryReader:
using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return memoryStream.ToArray();
}
Jeśli chcesz być naprawdę brutalny, moglibyśmy zmniejszyć liczbę using
sprawozdania (albo roztwór):
using (Stream fileStream = File.OpenRead(fileName),
memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return ((MemoryStream)memoryStream).ToArray();
}
Ale to po prostu nieprzyjemny :)
Inną opcją jest oczywiście użycie biblioteki, takiej jak MiscUtil, która ma metodę pełnego odczytu ze strumienia :) Metoda użyteczności może być tak prosta jak ta:
public static byte[] ReadFully(this Stream stream)
{
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return memoryStream.ToArray();
}
}
pamiętać, że ten nigdy zamyka strumień - rozmówca powinien zrobić.
Nie wszystkie strumienie zwracają jednak swoją długość ... –
data = binaryReader.ReadBytes (stream.Length); powinno być data = br.ReadBytes (stream.Length); – OneSHOT
Tak, okrzyki. Oczywiste literówki. – Noldorin