2009-06-19 7 views
7

Les chemins relatifs dans C# agissent visiblement pour moi. Dans un cas Im manipulant un ensemble d'objets Texture2d à mon application, c'est prendre le nom de fichier et l'utiliser pour localiser les fichiers et charger les textures dans les objets Image. Je charge ensuite une image à partir d'un chemin relatif stocké dans le fichier de classe et utilise un chemin relatif qui doit être relatif à Content/gfx. Mais si je ne charge pas ces textures, ces chemins relatifs échoueront. Comment puis-je garantir que mon chemin de rel ne va pas échouer? Dans le travail sur le Web, tous les chemins rel sont relatifs au dossier dans lequel le fichier dans lequel nous travaillons, puis-je le configurer de cette façon et faire tous les chemins rel dans le dossier racine où se trouve mon application?Chemins relatifs dans Winforms

+0

Est-ce en debug ou en mode déployé? –

Répondre

18

Je recommande de ne pas utiliser de chemins relatifs en premier lieu. Utilisez Path.Combine pour transformer vos chemins relatifs en chemins absolus. Par exemple, vous pouvez l'utiliser pour obtenir le chemin complet à votre EXE démarrage:

string exeFile = (new System.Uri(Assembly.GetEntryAssembly().CodeBase)).AbsolutePath; 

Une fois que vous avez, vous pouvez l'obtenir est le répertoire:

string exeDir = Path.GetDirectoryName(exeFile); 

et tournez votre chemin par rapport à un absolu chemin:

string fullPath = Path.Combine(exeDir, "..\\..\\Images\\Texture.dds"); 

Cela sera beaucoup plus fiable que d'essayer d'utiliser des chemins relatifs.

+0

Merci beaucoup pour les deux premières lignes, j'étais juste à la recherche. J'utiliserais '@' dans la troisième ligne pour éviter les doubles backslashs cependant. – radbyx

+0

Si mon répertoire contient un espace, il ne peut pas trouver le chemin, mais si ce n'est pas le cas, cela fonctionne très bien. – Xaisoft

1

Si vous attendez une ressource pour être dans le même répertoire que le fichier exécutable ou dans un sous-répertoire de ce répertoire, il est préférable d'utiliser toujours

string fullPath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), subPath); 

ou si vous craignez que le répertoire de travail Peut-être que vous avez tort, vous pouvez le faire:

string fullPath = System.IO.Path.Combine(System.Reflection.Assembly.GetEntryAssembly().Location, subPath); 
0

// [espace de nom] est l'espace de nom // vous devez copier votre fichier .-- dans le fichier Depug

 string path = (Assembly.GetEntryAssembly().Location + ""); 
     path = path.Replace("name space", "filename.--"); 


     // [WindowsFormsApplication4] is name space 
     //you should copy your "mysound.wav" into Depug file 

     //example:: 
     string path_sound = (Assembly.GetEntryAssembly().Location + ""); 
     path_sound = path_sound.Replace("WindowsFormsApplication4.exe", "mysound.wav"); 

     SoundPlayer player1 = new SoundPlayer(path_sound); 
     player1.Play(); 
Questions connexes