2010-03-17 10 views
8

Para el constructor ExcelPackage necesita un objeto FileInfo. Prefiero usar algún tipo de objeto de transmisión (por ejemplo MemoryStream), porque no necesito guardar el archivo en el servidor en sí, sino exponerlo como un FileStream de todos modos para el usuario. No quiero crear archivos que deba eliminar más adelante en servidores que solo están allí para generar y nunca más volver a usar. Aparte de eso, de lo contrario también necesito los derechos necesarios para la aplicación/usuario en el directorio/archivo en el servidor.¿Puedo convertir un objeto Stream en un objeto FileInfo?

Entonces mi pregunta es: ¿Cómo puedo convertir un objeto de flujo a un objeto FileInfo.

Respuesta

2

Agregar el siguiente constructor a ExcelPackage hace que sea posible el uso de corrientes en su lugar.

public ExcelPackage(Stream stream) { 
    _package = Package.Open(stream, FileMode.Create, FileAccess.ReadWrite); 

    Uri uriDefaultContentType = new Uri("/default.xml", UriKind.Relative); 
    PackagePart partTemp = _package.CreatePart(uriDefaultContentType, "application/xml"); 

    XmlDocument workbook = Workbook.WorkbookXml; 

    _package.CreateRelationship(Workbook.WorkbookUri, TargetMode.Internal, schemaRelationships + "/officeDocument"); 

    _package.DeletePart(uriDefaultContentType); 
} 
+0

¿Dónde y cómo puedo cambiar el código fuente como lo hizo? – user3207158

2

Una clase FileInfo es una envoltura simple alrededor de una ruta a un archivo en el disco.
No es posible tener un FileInfo envolver una secuencia de memoria.

Sin embargo, puede descargar el código fuente y agregar un constructor que tome un Stream. (La ruta del archivo solo se utiliza en el método WriteDebugFile)

7

No se puede convertir el Stream como tal en un FileInfo; ellos representan cosas completamente diferentes. Un Stream contiene datos que pueden o no representar un archivo en el disco. Un FileInfo por otro lado contiene metadatos sobre un archivo, que pueden existir o no.

Lo que puede hacer es escribir el contenido de la Stream a un archivo en el disco, crear un FileInfo que apunta a ese archivo y pasar esa FileInfo al constructor.

+5

Él dijo explícitamente que no quería hacer eso. – SLaks

+0

@SLaks: Lo sé. Y le informé por qué es poco probable que su deseo se haga realidad. Sin embargo, su sugerencia de agregar un constructor en el código es buena. –

+0

Estaba tratando de evitar tener que cambiar el código fuente, pero eso puede ser inevitable entonces. – Michael

0

No puede hacer eso, lo que debe hacer es sacar la secuencia de la memoria a un archivo y obtener el objeto FileInfo para el archivo recién creado y pasarlo a ExcelPackage.

-1

Según lo mencionado por Fredrik Mörk, esto no es posible ya que no hay una conversión predeterminada disponible entre ambos tipos y tampoco es una recomendación.

Solo para reference, aunque puede proporcionar su propia lógica Conversion implementando la interfaz IConvertible. de nuevo, no es el enfoque correcto en este escenario, pero puede ser útil en otro lugar.

class CustomStream : Stream, IConvertible 
    { 
     public FileInfo ConvertToFileInfo() 
     { 
      return new FileInfo(""); 
     } 
    } 

Esta es la forma de convertirlo

CustomStream stream = new CustomStream(); 
FileInfo fileInfo = stream.ConvertToFileInfo(); 
+0

Pero cuál es el uso ... También puede crear un FileInfo vacío y dárselo a la función en lugar de hacer una extensión. Probablemente ExcelPackage utiliza el FileInfo para obtener valores. Fingir puede dar resultados impredecibles – RvdK

+1

Esto no funcionará. 'ExcelPackage' intentará leer el archivo de la ruta en' FileInfo'. – SLaks

0

Si examina el código fuente para ExcelPackage, se utiliza el método Package.OpenFullName en la propiedad del objeto FileInfo pasado al constructor, con FileMode.Open y FileAccess.ReadWrite, para inicializar un objeto Package.

El método Package.Open también puede aceptar un Stream directamente.

Si quisiera, podría sobrecargar el constructor ExcelPackage mismo para aceptar un parámetro Stream, y simplemente llamar Package.Open en ese Stream objeto - que podría ser fácilmente, por ejemplo, un MemoryStream.

0

Sí se puede

var excelPackage = new ExcelPackage(); 
excelPackage.Load(fileStream); 
Cuestiones relacionadas