2009-06-19 27 views
7

I percorsi relativi in ​​C# si comportano in modo approssimativo per me. In un caso sto gestendo un set di oggetti Texture2d sulla mia app, prendendo il nome del file e usandolo per localizzare i file e caricare le trame in oggetti Image. Carico quindi un'immagine da un percorso relativo memorizzato nel file di classe e utilizzo un percorso relativo che deve essere relativo a Content/gfx. Ma se non carico queste trame questi percorsi relativi falliranno. Come posso garantire che il mio percorso rel non fallirà? Nel web work tutti i percorsi rel sono relativi alla cartella in cui si trova il file, posso impostarlo in questo modo e creare tutti i percorsi rel alla cartella principale in cui si trova la mia app?Percorsi relativi in ​​Winform

+0

È questo in debug o in modalità schierato? –

risposta

18

Si consiglia di non utilizzare i percorsi relativi in ​​primo luogo.

Utilizzare Path.Combine per trasformare i percorsi relativi in ​​percorsi assoluti. Ad esempio, è possibile utilizzare questo per ottenere il percorso completo del file EXE di avvio:

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

Una volta che avete che, si può ottenere è directory:

string exeDir = Path.GetDirectoryName(exeFile); 

e trasformare il vostro percorso relativo a un assoluto percorso:

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

Questo sarà molto più affidabile rispetto al tentativo di utilizzare percorsi relativi.

+0

Thx molto per le prime due righe, proprio stavo cercando. Vorrei usare '@' nella terza riga per evitare il doppio backslash. – radbyx

+0

Se la mia directory ha uno spazio al suo interno, non può trovare il percorso, ma in caso contrario, funziona correttamente. – Xaisoft

1

Se vi aspettate una risorsa di essere nella stessa directory del file eseguibile o in una sottodirectory di quella directory, è meglio usare sempre

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

o se siete preoccupati che la directory di lavoro è possibile che tu possa fare ciò:

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

// [spazio dei nomi] è il nome dello spazio // è necessario copiare il file .-- in Depug il file

 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(); 
Problemi correlati