Working directory vs. app dir

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1
  • Oregistrerad
  • 2006-08-31 16:36

Jag har min working directory.. men hur får jag smidigast ut vilken katalog själva applikationen jag kör ligger i? Det handlar om det där typiska felet där man inte kommer åt sina resursfiler för att man rotar efter dem i fel katalog

bsd/carbon.. c++..

"Working directory", du försöker väl inte jobba med wdRefNums? Det är i alla fall det gamla "working directory"-begreppet, och det finns inte i Carbon.

Tillämpningens plats får du ut med GetProcessInformation för kCurrentProcess. Då får du ut en FSSpec i processAppSpec-fältet. Behövs en kodsnutt?

  • Oregistrerad
  • 2006-09-01 11:00

Working directory kanske mer är windows-terminologi.. alltså katalogen man öppnar applikationen från. Om jag t ex står i min hemkatalog och kör en app från /usr/bin så blir hemkatalogen utpekad som "arbetskatalog".. vilket gör att jag inte ser mina resursfiler om jag inte kör med mer kompletta sökvägar till dem. Jag har löst problemet genom leta igenom hela disken (med start i ett gäng mer typiska kataloger) efter resurserna.. en helt enkelt skitful lösning.. men då kunde jag iaf testa appen lite bättre tills vidare

En sökning på ADC efter GetProcessInformation gav mig denna länk:
http://developer.apple.com/qa/fl/fl14.html
..nästan allt jag behövde veta antar jag. Det som saknas där nu är att jag får länkfel på GetProcessInformation (reference to undefined _GetProcessInformation). Där kommer då nästa fråga.. vilken bibbla eller vilket framework behöver jag länka med? Det kan jag däremot inte hitta med varken ADC eller google.

Länkar den inte? Den här kodsnutten länkar rakt av i Xcodes default-Carbon-exempel:

void GetAppSpec(FSSpec *theFSp)
{
OSErr err;
ProcessInfoRec appPIR;
ProcessSerialNumber appPSN;
Str255 apName;

appPSN.lowLongOfPSN = kCurrentProcess;
appPSN.highLongOfPSN = 0;
appPIR.processInfoLength = sizeof(ProcessInfoRec);
appPIR.processAppSpec = theFSp;
appPIR.processName = &apName;
err = GetProcessInformation(&appPSN, &appPIR);
}

  • Oregistrerad
  • 2006-09-01 11:55

Den länkade bättre efter att jag lagt tillbaka Carbon.framework

Tack för hjälpen!

Eftersom vi talade om Carbon vågade jag inte fråga om frameworket var med.

  • Oregistrerad
  • 2006-09-01 12:56

Den hittar fortfarande inte mina resurser .. hoppades på att slippa bråka med en sån här ful liten detalj.

PBHSetVolSync kanske inte riktigt är rätt väg att gå? Den är dessutom deprecated..

  • Oregistrerad
  • 2006-09-01 15:22

Nu började jag kolla på det här igen..
Jag har en FSSpec som pekar på rätt katalog.. och av den så kan jag plocka ur en ren och fin string som visar rätt. Nu behöver jag bara få den att förstå att det är den katalogen som gäller.

Vad är det egentligen du försöker göra? Med FSSpecen så kommer du ju lätt åt alla filer du vill i din bundle. (Jag antar att du kör Mach-O och inte CFM.) Vad är det som skall "förstå" vilken katalog som gäller?

  • Oregistrerad
  • 2006-09-01 15:50

Jag vill sätta den katalogen som "default" så jag inte behöver lägga till sökvägen framför varje fil (vilket egentligen inte är ett större problem i sig.. men det är ganska så mycket kod som skulle behöva gås igenom då). Iofs.. det känns egentligen som en snyggare lösning att lägga till sökvägen. Äsh.. jag har ju hela helgen på mig

Tack än en gång för hjälpen!
(Det är Mach-O)

  • Medlem
  • Uppsala
  • 2006-09-03 12:56

Vet inte om jag tolkar allt fel, men ditt problem låter ungefär som följande:
Mapp>
MittProgram.app
MittProgramData/Filer..

Enklaste sättet att ändra så att ditt program läser filerna med relativa sökvägar till MittProgramdata/Filer är med chdir kommandot..
Spontant borde följande i början av din kod hjälpa:
chdir("../../.."), det gör att programmets default sökväg ändras från samma mapp som mittprogram "exe" filen till Mapp.

Som sagt, hoppas det hjälper och inte rör till det i onödan..

  • Oregistrerad
  • 2006-09-04 09:30

chdir var den jag letade efter!
Men relativa sökvägar hade inte fungerat riktigt så enkelt. "Arbetskatalogen" är olika vid olika tillfällen.. så den måste man kolla upp under körning, vilket redan är löst med hjälp av inläggen ovan.

Jag löste det hela genom att lägga på sökvägen i efterhand.. precis enligt något tidigare inlägg. Det känns fortfarande som att det var en snyggare lösning i det här fallet.. men tyvärr klart krångligare att implementera såhär sent in i utvecklingen. Lite smått som gjort för att någon path-bugg ska dyka upp.. men några testcase bör nog plocka upp felen

1
Bevaka tråden