[C#] Générer un fichier temp sur le client

Suite à mon précédent topic sur Linq. Je cherche à améliorer mon web service d’export de données.
Aujourd’hui, le web service génère le fichier à exporter sur le serveur dans un des répertoires IIS. Pour ensuite, récupérer ce fichier sous forme d’url pour le rendre téléchargeable.

Le problème, c’est que le fichier fait dans la centaine de Mo et qu’il n’y a aucune notion de nettoyages auto des fichiers.

L’idée étant de générer ce fichier directement sur la machine cliente dans le répertoire temporaire de son Windows ou de Mes Documents. Comme ça, il n’y a aucune écriture côté serveur et en plus le fichier est nettoyé par Windows après un petit reboot. Je ne sais pas si c’est réellement faisable. Je pensais que la fonction Path.GetTempFilePath() me génère un chemin en se basant sur le poste client. Et bien, non.

Pour l’instant, je n’ai rien sur Google ou j’ai mal cherché.

Voilà, voilà.

Hum, j’ai une petite classe d’helper qui fait ca au taff, je te la pastebin demain :smiley:
Sinon, ne commet pas l’erreur de penser que le temp est vidé par windows tout seul hein. C’est pas le cas, nettoies bien les fichiers apres utilisation. Comme les capotes quoi.

Si ce n’est que du texte, tu peux peut-être compresser le fichier. Ca te fera gagner pas mal de place déjà.

http://pastebin.com/imU6cn3Z

Merci Ana-l. :smiley: Mais, oui, je chippotte. C’est que je ne veux pas supprimer le fichier tout de suite. Sachant que si j’ai plusieurs utilisateurs qui veulent éventuellement exporter leurs données, bah, y aura tout plein mais alors tout plein de fichiers csv. Et ces derniers prennent généralement au moins 2 min max pour les grosses données pour être finalisé.

Bon, après, y a moyen que je modifie légèrement ton script pour supprimer les fichiers obsolètes en me basant sur leur date de création/dernière modification (à fouiller si c’est possible).

Sinon, en fouillant le net, il y a l’IsolatedStorage qui répond parfaitement à mes besoins sauf que, je veux récupérer le chemin complet de ce storage et je n’ai pas encore trouvé la fonction pour ça. :smiley:

Par compression, tu vois ça dans quel genre ? zip ? ou bien par un algo de compressions pendant la phase d’écriture du fichier ?

Ionic.Zip pour la compression marche tres bien chez moi en 3 lignes :

using (ZlibStream zls = new ZlibStream(fileStream, CompressionMode.Compress, CompressionLevel.Level9, false)) { zls.Write(cellsMS.ToArray(), 0, (int)cellsMS.Length); zls.Flush(); }

T’as pas besoin de connaitre le chemin pour utiliser l’Isolate Storage :
L’exemple est assez complet sur msdn : http://msdn.microsoft.com/en-us/library/sy…filestream.aspx

[quote=« EzecKiel, post:7, topic: 50887 »]T’as pas besoin de connaitre le chemin pour utiliser l’Isolate Storage :
L’exemple est assez complet sur msdn : http://msdn.microsoft.com/en-us/library/sy…filestream.aspx[/quote]

Yep. Mais juste que le besoin est de faire télécharger le fichier généré à la fin du traitement (bon ok, c’est con de faire télécharger un fichier qui se trouve déjà sur le poste client en passant le chemin du fichier dans iexplorer). :smiley: C’est pour ça que je veux connaitre le chemin complet.

Bon, après, je ne dis pas que c’est propre ou quoique se soit. Je ne vois pas d’autres solutions.

Edit: bon, bah l’isolatedStorage cay nul aussi. :smiley: Puisque ce dernier se situe sur le serveur.

Edit bis: Alors, en me basant sur l’ensemble de vos suggestions, je suis donc resté sur l’écriture de fichiers sur le serveur. J’ai donc compressé mes fichiers générés (avec GZipStream de System.IO.Compression) en plus de nettoyer le répertoire en fonction de la date de création des fichiers (à hauteur de 2h mais peut etre paramétrable).

Je n’ai pas recensé énormément d’impact au niveau des performances.

Celà dit, si y a des gens qui ont une solution pour créer les fichiers directement sur le poste client à partir d’une appli web, je ne dis pas non. :slight_smile:

html5 :smiley:

HTML5 cay mort, l’appli qui va cohabiter avec mes pages ne tourne que sur Internet Explorer (à moins que la version actuelle gère enfin HTML 5 mais je doute). :smiley:

Comment ca “enfin”? Les specs de HTML 5 sont en draft mode. http://dev.w3.org/html5/spec/Overview.html
Et ca resoudrait pas ton probleme.

Attention parce que tu ne peux pas ouvrir des fichiers compressés avec GZipStream comme ça. Il faudra que tu les décompresses (toujours avec GZipStream) à un moment donné. C’est pour ça qu’AnA-l te conseillait Ionic.Zip, qui te génère des fichiers zip ouvrables avec Winzip etc.

Ah, mince. Dommage que je n’ai pas une machine ayant Winzip ou le dézipper Windows. On est tous sur Winrar :smiley: En plus je voulais éviter au possible d’utiliser des librairies supplémentaires même gratuit sauf si on ne peut pas faire autrement. En plus, j’ai vu sur Ionic qu’on pouvait choisir un niveau de compression, et c’est pas mal du tout.

Nan mais les fichiers ionic.zip sont ouvrables avec winrar. Mais Pas les fichiers compressés avec GZipStream.

Bon oublie ce que je viens de dire… je viens de tester l’exemple de la msdn et avec 7-zip ça a l’air de très bien fonctionner, winrar aussi… Au temps pour moi je ne sais pas où j’ai été pêché ça… :smiley:

Spa bien grave :smiley: A la limite vu que j’aurai un peu beaucoup de temps libre au taffe, je vais les comparer.

Au fait je suis peut être à côté de la plaque, mais pourquoi tu veux sauvegarder sur le filesystem ton fichier? Tu peux pas les garder en mémoire (avec un cache devant si comme tu précisais plusieurs clients peuvent demander les mêmes données) et les servir (avec l’équivalent C# d’une servlet) en zippant à la volée le fichier?

C’est possible de générer le fichier en cache et de le proposer via la popup d’IE de le télécharger ? (je n’ai jamais fait ça)
Par contre, il s’agit juste d’un petit prototype. Donc, je ne sais pas si des utilisateurs seront succeptibles d’exporter assez souvent les données.

[quote=“MetalDestroyer, post:18, topic: 50887”]C’est possible de générer le fichier en cache et de le proposer via la popup d’IE de le télécharger ? (je n’ai jamais fait ça)
Par contre, il s’agit juste d’un petit prototype. Donc, je ne sais pas si des utilisateurs seront succeptibles d’exporter assez souvent les données.[/quote]
Bin je connais pas le C# mais il n’y a pas de raison que ça ne le permette pas. Si j’avais à faire ça en Java j’aurais probablement fait une servlet (~= classe dont le but est de gérer une requête/réponse HTTP) et en fonction d’un paramètre sur la requête, j’aurais choppé les bonnes données côté serveur, je les aurais formatées et retournées en écrivant le flux binaire sur la response (en ayant pris soin de spécifier le mimetype).

Et l’histoire du cache, c’est en bonus si besoin.

[quote=“LeGzo, post:19, topic: 50887”]Bin je connais pas le C# mais il n’y a pas de raison que ça ne le permette pas. Si j’avais à faire ça en Java j’aurais probablement fait une servlet (~= classe dont le but est de gérer une requête/réponse HTTP) et en fonction d’un paramètre sur la requête, j’aurais choppé les bonnes données côté serveur, je les aurais formatées et retournées en écrivant le flux binaire sur la response (en ayant pris soin de spécifier le mimetype).

Et l’histoire du cache, c’est en bonus si besoin.[/quote]

Et si le flux est assez lourd genre 30 Mo et supérieur même après compression, ça marche bien ? Il n’y a pas de soucis au niveau du temps d’attente ou autre ? En gros l’idée, c’est comme pour du SOAP mais au lieu d’envoyer un flux XML, c’est du binaire ?
Je vais voir ça après confirmation de ta part.