11
votes

Puis-je convertir un objet de flux en un objet FileInfo?

pour le Excelpackage constructeur Vous avez besoin d'un objet FileInfo. J'utilise plutôt une sorte d'objet de flux (F.i. Morthstream), car je n'ai pas besoin de sauvegarder le fichier sur le serveur lui-même, mais l'expose comme filtream de toute façon à l'utilisateur. Je ne veux pas faire de fichiers que je dois supprimer latérone des serveurs qui ne sont là que là-bas pour générer des objectifs et jamais utilisé à nouveau. En dehors de cela, sinon j'ai besoin également des droits nécessaires à l'application / utilisateur sur le répertoire / fichier sur le serveur.

Donc, ma question est alors: comment puis-je convertir un objet de flux en un objet FileInfo.


0 commentaires

7 Réponses :


2
votes

A fichierInfo est un wrapper simple autour d'un chemin d'accès à un fichier sur disque.
Il n'est pas possible d'avoir un fichierinfo envelopper un flux de mémoire.

Cependant, vous pouvez télécharger le code source et ajouter un constructeur qui prend un flux . (Le chemin de fichier n'est utilisé que dans la méthode Wriditebugfile


0 commentaires

9
votes

Vous ne pouvez pas convertir le flux comme tel sur un fichierinfo ; Ils représentent des choses entièrement différentes. Un flux contient des données Thay peut ne pas représenter un fichier sur disque. Un fichierInfo d'autre part contient des métadonnées sur un fichier, qui peut ou non exister.

Ce que vous peut faire est d'écrire le contenu du flux à un fichier sur disque, créez un fichierinfo pointant sur ce fichier et Passer que fichierInfo sur le constructeur.


4 commentaires

Il a explicitement dit qu'il ne veut pas faire ça.


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


J'essayais d'éviter de devoir changer le code source, mais cela peut devenir inévitable alors.


@Michael: Oui, il semble se tenir entre ces deux; corrigez le code ou enregistrez le fichier. Soit on sauvera la journée.



0
votes

Vous ne pouvez pas faire cela, ce que vous devriez faire est de délivrer le flux de la mémoire dans le fichier et d'obtenir l'objet FileInfo pour le fichier nouvellement créé et de le transmettre à l'Excelpackage.


0 commentaires

-3
votes

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

juste pour référence < / Code>, vous pouvez également fournir votre propre conversion logique en implémentant iconvertible interface. Encore une fois, pas bonne approche dans ce scénario, mais peut être utile ailleurs. xxx

Voici comment convertir-le xxx


2 commentaires

Mais quelle que soit l'utilisation ... Vous pouvez également créer un fichier videfo et le donner à la fonction au lieu de faire une extension. Probablement l'Excelpackage utilise le fichierInfo pour obtenir des valeurs. La simulation peut donner des résultats imprévisibles


Cela ne fonctionnera pas. ExcelPackage ESSAYERa de lire le fichier à partir du chemin dans le fichier FileInfo .



2
votes

Ajout du constructeur suivant à Excelpackage permet d'utiliser des 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 );
}


1 commentaires

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



0
votes

En regardant le code source de Excelpackage , il utilise la méthode package.open sur la propriété FULLNAME de la propriété FileInfo < / Code> Objet passé au constructeur, avec filemode.open et filaccess.readwewrite , pour initialiser un fichier objet

La méthode package.open peut également accepter un flux directement.

Si vous le souhaitez, vous pouvez surcharger le Excelpackage Constructeur vous-même pour accepter un paramètre flux et simplement appeler package.open sur ce < Code> flux objet - qui pourrait facilement être, par exemple, un MemoryStream .


0 commentaires

2
votes

Oui, vous pouvez

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


0 commentaires