2012-06-13 4 views
1

J'ai une question assez simple concernant la visualisation du texte dans Firefox. Mon application produit du texte que j'ai besoin de voir dans Firefox. Si je sauvegarde un fichier .txt et l'ouvre dans Firefox, l'un des plugins pour le navigateur est capable d'utiliser le texte et de faire ce qu'il doit faire. J'ai accompli cela en créant un fichier temporaire, en y écrivant le texte, puis en ouvrant le fichier dans Firefox. Le problème est, j'ai besoin de supprimer ce fichier une fois qu'il est alimenté à Firefox, donc je n'ai pas des centaines de ceux qui traînent. J'utilise la méthode du fichier temporaire parce que je n'ai pas pu trouver d'informations sur le fait de pouvoir passer juste un peu de texte dans les arguments du navigateur.Envoyer un texte brut à Firefox

De toute façon, c'est ce que j'ai en ce moment et vous pouvez voir mon File.Delete supprime effectivement le fichier avant que Firefox puisse y accéder. Si je passe le code plus lentement, ça va.

Des idées?

try 
{ 
    string fileName = Path.GetTempFileName(); 
    FileInfo fileInfo = new FileInfo(fileName); 
    fileInfo.Attributes = FileAttributes.Temporary; 

    string writetext = "text I need in a Firefox page"; 
    File.WriteAllText(fileName, writetext); 

    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.FileName = "firefox.EXE"; 
    startInfo.Arguments = fileName; 
    Process.Start(startInfo); 

    if (File.Exists(fileName)) 
    { 
     File.Delete(fileName); 
    } 

    } 
    catch (SystemException ex) 
    { 
    MessageBox.Show("An error occured: " + ex.Message); 
    } 
+0

Vous devez attendre jusqu'à ce que le processus a tiré vers le haut. Peut-être que le thread suivant sera utile: [Faire un processus.Start attendre jusqu'à ce que le processus a démarré] (http://stackoverflow.com/questions/6390030/c-sharp-making-a-process-start-wait -until-le-processus-a-start-up) –

Répondre

4

Ou vous pouvez utiliser data URI à la place, par exemple

+0

+1. Merci pour cette info - je n'avais jamais vu ça auparavant, et j'ai été surpris d'apprendre que ça fonctionne comme dans une instance de Firefox ouverte (sans les guillemets). –

+1

Les guillemets sont pour quand j'ai essayé de le lancer à partir de la ligne de commande, sinon chaîne est traitée comme un tableau de paramètres et Fx ouvrirait des onglets pour chaque mot. –

+0

La meilleure partie à propos des données uris est de base64 certains html/javascript et l'intégrer dans un site de support de mise en forme limitée mal testé pour un simple xss. –

0

Je voudrais créer un sous-dossier spécifique à l'application dans le dossier TEMP de l'utilisateur et y stocker des fichiers.

En faisant cela, je suppose que personne d'autre ne va écrire dans ce dossier, sauf moi. Le code Chaque code Process.Start est exécuté tous les fichiers doivent être supprimés de ce dossier en utilisant le filtre "le fichier a été créé il y a plus de 30 minutes" (la valeur peut être différente).

Dans le pire des cas, il y aura quelques fichiers dans ce dossier, mais le nombre de fichiers ne sera pas augmenté.

0

Voici quelques approches que vous pourriez prendre ici. L'approche la plus risquée consiste simplement à appeler le Thread.Sleep(5000) et espérons que Firefox aura le temps de lire le fichier avant de le supprimer. Cependant, sur un système très lent, cela pourrait ne pas suffire.

La meilleure approche est d'attendre jusqu'à ce que le processus se termine avant de supprimer le fichier:

var p = Process.Start(startInfo); 
p.WaitForExit(); 
if(File.Exists(fileName)) { 
    File.Delete(fileName); 
} 

Ceci, bien sûr, va bloquer votre programme d'appel jusqu'à ce que Firefox sort. Il y a une autre option encore, et c'est d'attendre l'événement Exited:

var p = Process.Start(startInfo); 
p.Exited += FirefoxExited; 

// ... 

void FirefoxExited(object sender, EventArgs e) { 
    if(File.Exists(fileName)) 
     File.Delete(fileName); 
}