2011-02-15 29 views
16

Duplicar posible:
How do I save a stream to a file?guardar un archivo (de corriente) en el disco usando C#

Tengo un objeto de flujo que puede ser una imagen o archivo (MS Word, pdf) , He decidido manejar ambos tipos de manera muy diferente, ya que puedo optimizar/comprimir/cambiar el tamaño/producir miniaturas, etc. Llamo a un método específico para guardar una imagen en el disco, el código:

var file = StreamObject; 

//if content-type == jpeg, png, bmp do... 
    Image _image = Image.FromStream(file); 
    _image.Save(path); 

//if pdf, word do... 

¿Cómo realmente guardo word y pdfs?

//multimedia/ video? 

He mirado (no dura lo suficiente, probablemente), pero no pude encontrar en cualquier lugar ...

+0

lo siento, leí la pregunta ... – Craigt

+0

Mira aquí Si algo de esto no funciona. http://stackoverflow.com/questions/13100666/access-assets-from-monodroid-class-library/17824673#17824673 –

Respuesta

20

Para el tipo de archivo puede confiar en FileExtentions y para escribirlo en el disco puede usar BinaryWriter. o un FileStream.

Ejemplo (Asumiendo que ya tiene una corriente):

FileStream fileStream = File.Create(fileFullPath, (int)stream.Length); 
// Initialize the bytes array with the stream length and then fill it with data 
byte[] bytesInStream = new byte[stream.Length]; 
stream.Read(bytesInStream, 0, bytesInStream.Length);  
// Use write method to write to the file specified above 
fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
+0

¿cómo podría guardar el disco, código de muestra? – Haroon

+2

gracias, envolví el filestream en una declaración de uso también ... – Haroon

+0

acabo de dar un código de muestra ... no solicitó las mejores prácticas ... de cualquier manera, buen punto –

0

si los datos son ya válidos y ya contiene un pdf, palabra o imagen, entonces se podría utilizar un StreamWriter y guárdelo.

+2

ejemplo de algún código? Actualmente tengo: StreamWriter filewriter = new StreamWriter (archivo); Quiero guardar en una ubicación específica en el disco – Haroon

4

tengo que citar a Jon (el maestro de C#) al Plato:

Bueno, el más fácil manera sería abra una secuencia de archivo y luego use:

byte [] data = memoryStream.ToArray(); fileStream.Write (data, 0, data.Length);

Aunque es relativamente ineficiente, ya que implica copiar el búfer. Está bien que los pequeños arroyos, pero para enormes cantidades de datos que debe considerar el uso de :

fileStream.Write (memoryStream.GetBuffer(), 0, memoryStream.Position);

1

Para el filestream:

//Check if the directory exists 
if (!System.IO.Directory.Exists(@"C:\yourDirectory")) 
{ 
    System.IO.Directory.CreateDirectory(@"C:\yourDirectory"); 
} 

//Write the file 
using (System.IO.StreamWriter outfile = new System.IO.StreamWriter(@"C:\yourDirectory\yourFile.txt")) 
{ 
    outfile.Write(yourFileAsString); 
} 
23

Si está utilizando .NET 4.0 o posterior puede utilizar este método:

public static void CopyStream(Stream input, Stream output) 
{ 
    input.CopyTo(output); 
} 

Si no es así, utilice la siguiente:

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[8 * 1024]; 
    int len; 
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, len); 
    }  
} 

Y aquí cómo usarlo:

using (FileStream output = File.OpenWrite(path)) 
{ 
    CopyStream(input, output); 
} 
+2

Como el código anterior se copió de [esta respuesta SO] (http://stackoverflow.com/a/411605/678801), creo que se ha establecido una referencia a la respuesta original. –

+3

¿Estás seguro? Tal vez de [este] (http://stackoverflow.com/questions/230128/best-way-to-copy-between-two-stream-instances)? O tal vez de [Spring.NET fuente] (https://github.com/spring-projects/spring-net/blob/master/src/Spring/Spring.Core/Util/IoUtils.cs)? Supongo que esta implementación es aún más antigua. Tal vez usé el código de la respuesta de Jon en este momento, pero no puedo recordarlo porque fue hace casi 4 años;) – rotman

0

Simplemente hágalo con un simple filestream.

var sr1 = new FileStream(FilePath, FileMode.Create); 
       sr1.Write(_UploadFile.File, 0, _UploadFile.File.Length); 
       sr1.Close(); 
       sr1.Dispose(); 

_UploadFile.El archivo es un byte [] y en FilePath se puede especificar la extensión del archivo.

+0

FileStream.Close() y FileStream.Dispose() son lo mismo; no hay ninguna razón para usar ambos. –

Cuestiones relacionadas