2010-03-17 9 views
8

Pour le constructeur ExcelPackage, vous avez besoin d'un objet FileInfo. J'utilise plutôt une sorte d'objet stream (f.i. MemoryStream), car je n'ai pas besoin de sauvegarder le fichier sur le serveur lui-même, mais de l'exposer en tant que FileStream à l'utilisateur. Je ne veux pas faire des fichiers que je dois supprimer plus tard des serveurs qui ne sont là que pour la génération et qui ne seront plus jamais utilisés. En dehors de cela, sinon j'ai besoin également des droits nécessaires pour l'application/utilisateur sur le répertoire/fichier sur le serveur.Puis-je convertir un objet Stream en un objet FileInfo?

Ma question est alors: Comment puis-je convertir un objet de flux à un objet FileInfo.

Répondre

2

Ajout du constructeur suivant à ExcelPackage permet d'utiliser les flux à la place.

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

Où et comment puis-je changer le code source comme vous l'avez fait? – user3207158

2

Une classe FileInfo est une simple enveloppe autour d'un chemin vers un fichier sur le disque.
Il n'est pas possible d'avoir un flux de mémoire de FileInfo.

Cependant, vous pouvez télécharger le code source et ajoutez un constructeur qui prend un Stream. (Le chemin du fichier n'est utilisé que dans la méthode WriteDebugFile)

7

Vous ne pouvez pas convertir le Stream en tant que tel en FileInfo; ils représentent des choses entièrement différentes. Un Stream contient des données qui peuvent ou non représenter un fichier sur le disque. Un FileInfo d'autre part contient des métadonnées sur un fichier, qui peut exister ou non.

Qu'est-ce que vous pouvez faire est d'écrire le contenu du Stream dans un fichier sur le disque, créez un FileInfo pointant à ce fichier et passer que FileInfo au constructeur.

+5

Il a dit explicitement qu'il ne veut pas le faire. – SLaks

+0

@ SLaks: Je sais. Et je l'ai informé pourquoi son souhait est peu susceptible de se réaliser. Cependant, votre suggestion avec l'ajout d'un constructeur dans le code est une bonne idée. –

+0

J'essayais d'éviter d'avoir à changer le code source, mais cela peut devenir inévitable alors. – Michael

0

Vous ne pouvez pas le faire, ce que vous devez faire est sortie le flux de mémoire pour déposer et faire l'objet FileInfo pour le fichier nouvellement créé et le passage à la ExcelPackage.

-1

Comme mentionné par Fredrik Mörk, ce n'est pas possible car leur conversion par défaut n'est pas disponible entre les deux types et n'est pas recommandée.

Juste pour reference, vous pouvez cependant fournir votre propre logique Conversion en mettant en œuvre IConvertible Interface. encore une fois pas la bonne approche dans ce scénario, mais peut être utile ailleurs.

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

Voici comment le convertir

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

Mais quelle est l'utilisation ... Vous pouvez également créer un FileInfo vide et le donner à la fonction au lieu de faire une extension. Probablement le ExcelPackage utilise le FileInfo pour obtenir des valeurs. Faking peut donner des résultats imprévisibles – RvdK

+1

Cela ne fonctionnera pas. 'ExcelPackage' va essayer de lire le fichier du chemin dans' FileInfo'. – SLaks

0

regardant le code source pour ExcelPackage, il utilise la méthode Package.Open sur la propriété de l'objet FullNameFileInfo transmis au constructeur, avec FileMode.Open et FileAccess.ReadWrite, pour initialiser un objet Package.

La méthode Package.Open peut également accepter un Stream directement.

Si vous voulez, vous pouvez surcharger le constructeur vous ExcelPackage d'accepter un paramètre Stream, et il suffit d'appeler Package.Open sur cet objet Stream - qui pourrait facilement être, par exemple, un MemoryStream.

0

Oui vous pouvez

var excelPackage = new ExcelPackage(); 
excelPackage.Load(fileStream); 
Questions connexes