2010-05-31 3 views
0

J'ai un programme que j'ai écrit en C#, qui charge une image avec Image.FromFile, et il charge l'image avec succès à chaque fois. Toutefois, lorsque vous faites glisser et déposer un autre fichier sur l'exécutable, comme vous donnez au programme l'argument de ligne de commande du fichier, et le fichier ne se trouve pas dans le même dossier que l'exécutable, le programme se bloque car il indique le chemin d'accès au le fichier n'existe pas, même si c'est le cas.Le programme ne parvient pas à charger l'image à partir du chemin relatif du fichier de drag-drop ouvert

Je pense qu'en laissant tomber un fichier sur l'exécutable, il change le chemin qu'il charge des images d'une manière ou d'une autre. Comment puis-je résoudre ce problème?

Répondre

1

Votre programme serait démarré avec un répertoire Environment.CurrentDirectory différent. Assurez-vous toujours de charger les fichiers avec un nom de chemin absolu (par exemple ne pas utilisez Image.FromFile ("blah.jpg")).

Pour obtenir le chemin absolu vers un fichier stocké dans le même répertoire que votre fichier EXE, vous pouvez utiliser Application.StartupPath par exemple. Ou Assembly.GetEntryAssembly(). Emplacement si vous n'utilisez pas Windows Forms.

0

Cela dépend de la manière dont vous lancez le fichier en dehors de votre application. Si vous cliquez et faites glisser un fichier à partir de l'Explorateur Windows, le nom de chemin complet complet est inclus dans la liste. Dans ce cas, le code suivant indique le nom du fichier et effectue une chute du contenu du fichier dans une zone de texte:

private void textBox1_DragEnter(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
     e.Effect = DragDropEffects.Copy; 
} 

private void textBox1_DragDrop(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
    { 
     var objPaths = (string[])(e.Data.GetData(DataFormats.FileDrop)); 
     if (objPaths != null && objPaths.Length > 0 && File.Exists(objPaths[0])) 
     { 
      MessageBox.Show(string.Format("Filename: {0}", objPaths[0])); 
      using (TextReader tr = new StreamReader(objPaths[0])) 
       textBox1.Text = tr.ReadToEnd(); 
     } 
    } 
} 

Alors laissez-nous savoir plus sur votre source de déplacement. Vous devrez probablement modifier votre source pour faire glisser le chemin absolu ou déterminer le chemin complet à partir du chemin relatif dans les données de déplacement.

De plus, votre programme ne devrait jamais tomber en panne en raison de données erronées. Vérifiez les conditions requises ou utilisez un bloc try/catch autour du code nécessaire.

Questions connexes