Avatar billede public2 Nybegynder
11. november 2009 - 12:29 Der er 10 kommentarer og
1 løsning

Sti til fil på Windows og på Mac (og andet)

Hej Eksperter,

jeg er ved at lægge sidste hånd på hoveddelen af et projekt jeg laver med en. Vi sad hele natten i går og kæmpede med et problem, der nok synes banalt.

I vores Java program skal vi indlæse en *.txt fil med en masse info, de bliver læst ind i et hashmap og koden virker helt fint i vores Eclipse miljø. Vores problem opstod da vi skulle pakke det hele til en jar fil (vi bruger Ant, men tror nu ikke det har noget at sige).

Vores problem opstår i forskelle på hvordan ét styresystem refererer til en fil og et andet styresystem gør det på en anden måde.

Kort og godt ser vores mappe struktur således ud:

* Projektmappe (indeholder Eclipse .project fil og andet små)
** src (vores sourcemappe som indeholder alle vores *.java filer)
** data (den mappe der indeholder alle de *.txt filer vi skal have indlæst)
** bin (den mappe hvori vi vores kompilerede *.class filer ligger i og som er dem der skal laves til jar.

#|Projektmappe
#|
#|--src
#|--data
#|--bin

Her er mit spørgsmål så. I vores java projekt har vi stien således:

String dir = "";
dir = "./Data/";

Så vidt jeg har forstået gør "." (punktumet) at den står i roden af projektet (altså "projektmappe") og går så ind i mappen "/Data/" hvor den så finder den fil specificeret.

Dette virker som sagt fint når vi kører det igennem Eclipse. Når vi prøver at lave en jar og sikre os, at det hele ligger korrekt i mappestruktur, så har min makkers Mac intet problem med at køre "./Data/" stien, hvorom min PC m/ Windows ikke kan; dog har jeg en klar fornemmelse om, at den vil kunne uden "." (punktumet).

Det mærkelige er så, at vi prøvede at køre JAR filen på min makkers anden mac, men der havde den også problemer med at læse stien.

Jeg nægter at tro at jeg er den første med sådan et problem og der må være en slags universel løsning på problemet, for det kan da ikke være rigtigt at vi skal lade koden tjekke 5-6 steder for en fil, bare for at sikre os ethvert styre- og filsystem?

Hvis jeg ikke har forklaret mig ordentlig eller I har brug for mere information, så tøv endelig ikke med at skrive.

På forhånd tak for jeres tid og hjælp
Public
Avatar billede arne_v Ekspert
11. november 2009 - 14:43 #1
et punktum plejer at betyde nuværende directory d.v.s. det afgørende er hvor man "står" når man kører jar filen.
Avatar billede arne_v Ekspert
11. november 2009 - 14:44 #2
At bruge nuværende directoy som basis er ikke særligt robust.

For readonly filer ville jeg putte tekst filerne ind i jar filen.

Ellers kan du få koden til selv at finde stien til jar filen og operere relativt i forhold til denne.
Avatar billede public2 Nybegynder
11. november 2009 - 14:52 #3
Hej Arne,

tak for dit svar.

Grunden til at jeg er lidt mystificeret over problemet er nemlig, at jeg ved at punktum betyder den nuværende sti, men af en eller anden grund så kan vi ikke få det til at virke når vi laver JAR file. Det virker jo dog når vi begge kører programmet i Eclipse.

Vi lægger også tekst filerne ind i JAR'en, i samme mappestruktur som overstående, altså at den står i roden og peger ind i mappen "Data".

Vi har overvejet om det kan have noget at gøre med at vi bruger et stort D i mappenavnet "Data", men så alligevel, det burde den vel håndtere?

Men måske din løsning med at få koden til selv at finde stien til jar filen og operere relativt i forhold til den vil være en god løsning.
Hvordan kan man det?

- Public2
Avatar billede arne_v Ekspert
11. november 2009 - 15:03 #4
Hvis tekst filerne er inde i jaren så kan i vel læse dem derfra fremfor fra disk ??
Avatar billede arne_v Ekspert
11. november 2009 - 15:21 #5
getClass().getResourceAsStream("/Data/foobar.txt")

vil åbne en InputStream til en text fil inde i jar filen.
Avatar billede arne_v Ekspert
11. november 2009 - 15:21 #6
private static String getPath(Class cls) {
        String cn = cls.getName();
        String rn = cn.replace('.', '/') + ".class";
        String path = GetPath.class.getClassLoader().getResource(rn).getPath();
        int ix = path.indexOf("!");
        if(ix >= 0) {
            path = path.substring(0, ix);
        }
        return (new File(path)).getParent();
    }

finder den fil som en given klasser er i .class/.jar
Avatar billede Temp_dk Nybegynder
12. november 2009 - 13:15 #7
Lidt til #3

D og d er ikke det samme på en Mac eller Linux.
På en Mac eller linux kan du sagtens have mapperne Data og data i den samme mappe
Avatar billede arne_v Ekspert
04. december 2009 - 20:40 #8
Kommet videre?
Avatar billede public2 Nybegynder
08. december 2009 - 14:53 #9
Hej, sorry jeg ikke har fået svaret.

Vores fokus i projektet blev lidt afsporet af stien, men vi er inde i den sidste fase hvor JAR filen skal laves og så skal vi nok bruge dit gode råd, så skal nok vende tilbage inden alt for lang tid.

Vi skal egentlig blot lave det til en Windows maskine, men den professionelle stolthed gør, at da gerne vil lave det så programmet virker på alle systemer.

Mvh
Public
Avatar billede public2 Nybegynder
15. december 2009 - 08:19 #10
Hej Arne,

Nåh det viste sig at vi fandt en anden løsning, som var at bygge strukturen ind i ANT og derefter i vores jar, så løste det sig.

Men du skal alligevel have point og tak for dine svar og din tid, så smid du et svar :-)

Mvh
Public
Avatar billede arne_v Ekspert
15. december 2009 - 15:47 #11
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester