Koitan käynnistää toisen ohjelman, mutta jostain syystä polut ovat "väärin"
Aluksi ohjelmien polut selventämään:
Ohjelma, mistä toinen ohjelma yritetään käynnistää:
C:\unityProjects\test\game.exe
Ohjelma, mitä yritetään käynnistää:
C:\unityProjects\test\server\server.exe
game.exe koodia
Console.writeLine(Environment.CurrentDirectory); //tulostaa C:\unityProjects\test Process.Start(Environment.CurrentDirectory + "/server/server.exe");
server.exe koodia
private void Form1_Load(object sender, EventArgs e) { MessageBox.Show(Environment.CurrentDirectory); }
Mikäli koitan käynnistää Process.Start:lla, serverin MessageBox näyttää C:\unityProjects\test ja server.exe kaatuu virheilmoituksella "Could not find a path C:\unityProjects\test\data\servSettings.txt" kun polun pitäisi olla C:\unityProjects\test\server\data\servSettings.
Jos taas käynnistän suoraan serverin, MessageBox ilmottaa polun oikein: C:\unityProjects\test\server
Mistä moinen mahtaa johtua, että ilmeisesti, jos ohjelma käynnistetään Process.Start:lla, käynnistyvä ohjelma näyttää samaa polkua Environment.CurrentDirectory:lla, joka sen käynnisti, eikä polkua, missä se todellisuudessa on.
Tietenkin currentdirectory on se, missä suorittaja on, eikä se missä suoritettava ohjelma sijaitsee. Muutenhan koko nykyisen hakemiston konsepti olisi melko hyödytön.
Toki voit määritellä haluamasi työhakemiston käynnistettävälle prosessille
process.StartInfo.WorkingDirectory
Eli Process.Startia käyttämällä, suoritettavan ohjelman CurrentDirectory on eri, kuin silloin että suoritettava ohjelma käynnistettäisiin suoraan, ilman Process.Startia. Hmm... tuntuu hieman ristiriitaiselta.
Mutta sain tuolla WorkingDirectory:lla pelittämään, kiitän.
Jonne kirjoitti:
Eli Process.Startia käyttämällä, suoritettavan ohjelman CurrentDirectory on eri, kuin silloin että suoritettava ohjelma käynnistettäisiin suoraan, ilman Process.Startia. Hmm... tuntuu hieman ristiriitaiselta.
Ei vaan sama, eli ei mitenkään ristriitaista.
Jos avaat command promptin ja olet vaikka hakemistossa c:\Users\Jonne ja kirjoitat c:\unityProjects\test\Server\server.exe niin eikös tuo silloinkin ilmoita currentdirectoryksi c:\Users\Jonne ?
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
Sain tuon polku probleemani selvitettyä, mutta nyt osalla käyttäjillä on tullut vastaan tämänmoinen ongelma. (osalla taas toimii ongelmitta)
Taustalla oleva explorer näyttäisi, että polku on oikein ja tenttaamalla käyttäjiä, selvitin että read-only attribuutti on pois päältä kyseisestä tiedostosta.
Saattaa olla vähän hakuammuntaa kysyä arvailuja tähän, mutta mikähän tuossa voisi olla ongelmana.
Sun pitää tallentaa data käyttäjän hakemistoon, jos ei ole jotain erityistä tarvetta juurikin globaaleille asetuksille. Oikeiden polkujen selvittämiseen löytyy kyllä toiminnot .NET:stä.
Onko jokin erillistarve ulkoiselle tiedostolle sen sijaan, että käyttäisi Configuration File:ä?
How to: Add an application Configuration file to a C# project
Sainkin ratkastua tämän lisäämällä projektiin manifest tiedoston ja sinne <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> joskaan tämä ei varmastikkaan ole "nätein" ratkaisu. Pitääpä huomenna googletella/tutkiskella noita teidän ohjeita.
Aihe on jo aika vanha, joten et voi enää vastata siihen.