Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# Process.Start & Environment.CurrentDirectory

Sivun loppuun

Jonne [15.08.2013 20:00:25]

#

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.txt

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.

Grez [15.08.2013 20:57:17]

#

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

Jonne [15.08.2013 21:54:26]

#

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.

Grez [15.08.2013 22:31:33]

#

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 ?

groovyb [16.08.2013 11:07:52]

#

string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

Jonne [16.08.2013 19:22:31]

#

Sain tuon polku probleemani selvitettyä, mutta nyt osalla käyttäjillä on tullut vastaan tämänmoinen ongelma. (osalla taas toimii ongelmitta)

Access denied

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.

The Alchemist [16.08.2013 20:01:45]

#

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ä.

groovyb [16.08.2013 20:10:23]

#

Onko jokin erillistarve ulkoiselle tiedostolle sen sijaan, että käyttäisi Configuration File:ä?

How to: Add an application Configuration file to a C# project

Jonne [17.08.2013 02:03:58]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta