2010-08-11 7 views
14

J'écris un programme qui lance un fichier aléatoire dans un répertoire. le fichier peut être n'importe quand, mais surtout des fichiers vidéo ou image. chaque fois que je lance un fichier que je veux fermer le précédent ouvert. le code est:Process.Start renvoie null

string FolderSelected = ""; 
    string FileName = ""; 
    Process proc; 

    List<string> FilesDisplayed = new List<string>(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (FolderSelected == string.Empty) 
      FolderSelected = Properties.Settings.Default.FilesDefaultFolder; 

     if (proc != null) 
     { 
      proc.CloseMainWindow(); 
      proc.Close(); 
     } 
     FileName = FetchRandomFile(); 
     proc = Process.Start(FileName); 


    } 

le problème est, que je continue à obtenir proc = null (le fichier est lancé correctement) et je ne peux pas aller chercher le processus précédemment ouvert afin de le fermer. Je sais que .NET réutilise des processus et c'est pourquoi il retourne Null mais j'ai besoin de surcharger ce comportement. aidez s'il vous plaît, Guy.

+5

Êtes-vous sûr que votre code ci-dessus est correct? 'proc' sera toujours' null' dans votre exemple. –

Répondre

-1

Vous déclarez 'proc' à la portée de la méthode, donc bien sûr, sera toujours être nul lorsqu'il est vérifié en haut de cette méthode. Si vous souhaitez que la référence dépasse la fonction, déclarez qu'il s'agit d'une variable de niveau classe.

Vous générez un processus à chaque fois (probablement), Process.Start ne renvoie pas de valeur null, mais vous perdez simplement la référence lorsque je ne suis plus dans le champ d'application.

12

EDIT: Grâce au commentaire de leppie, je soupçonne que je connais la réponse: je suppose que vous «démarrez» quelque chose comme une image et réutilisez un processus existant pour ouvrir le document au lieu d'en créer un nouveau.

J'ai reproduit ce avec cette simple application de test:

using System; 
using System.Diagnostics; 

public class Test 
{ 
    static void Main() 
    { 
     Process proc = Process.Start("image.tif"); 
     Console.WriteLine(proc == null); 
    } 
} 

Cette affiche « true » parce qu'il utilise dllhost.exe pour héberger l'image de Windows Viewer, plutôt que de créer un nouveau processus.

+4

'Démarrage du processus statique (ProcessStartInfo startInfo)' peut renvoyer 'null' si le processus n'a pas démarré (ou est déjà démarré). – leppie

+0

@leppie: Merci, je n'étais pas au courant de ça. Éditera. –

+1

J'ai besoin de surcharger ce comportement, car je veux fermer le dernier fichier ouvert avant d'en ouvrir un nouveau. comment puis-je faire cela? – gash25

0

Cela ne compilera même pas (affectation définie). En tant que variable de méthode , proc est local uniquement pour la méthode de déclaration (/ scope), c'est-à-dire button2_Click, ce qui explique pourquoi vous ne pouvez pas conserver les valeurs. Si proc est destiné à persister entre les appels, la promotion à un champ (par instance variable):

Process proc; 
private void button2_Click(object sender, EventArgs e) 
{ 
    if (proc != null) 
    ... 
0

Pour résoudre ce problème, vous devez définir UseShellExecute false pour contourner la coquille.

Au lieu de

Process.Start("filename", "args")` 

utilisation

Process.Start(new ProcessStartInfo() { 
    Filename = "filename", 
    Arguments = "args", 
    UseShellExecute = false 
} 
+1

Ça ne marche pas dans mon cas.Je reçois une exception qui dit que le fichier n'est pas une application Win32 correcte (dans mon cas, il s'agit d'un fichier vidéo). Cela ne fonctionne qu'avec les exécutables. –