Avatar billede emileej Nybegynder
26. november 2002 - 14:19 Der er 27 kommentarer og
1 løsning

Navnet på det dir class filen befinder sig i

Når man kalder File constructoren, starter man i det dir hvorfra kaldet til java (hvis det f.eks. er via windows konsollen) går fra. Jeg vil vide hvordan jeg kan få fat i den absolutte sti til den aktive .class fil.

E-)mil
Avatar billede bearhugx Nybegynder
26. november 2002 - 14:24 #1
Den aktive class-fil ?? ...
Hvad mener du, Emil ?
Avatar billede emileej Nybegynder
26. november 2002 - 14:35 #2
Dav dav der! :p
Min java app ligger her:
C:\minapp\
Men jeg kan ikke være sikker på at slutbrugeren vælger at placere den der - derfor skal jeg have fat i stien til min aktive / hoved- / applikationens class fil, der i mit tilfælde er "C:\minapp\".

E-)mil
Avatar billede arne_v Ekspert
26. november 2002 - 14:35 #3
Du vil vide hvilket directory du er i ?

System.getProperty("user.dir")
Avatar billede emileej Nybegynder
26. november 2002 - 14:45 #4
Jeg vil vide hvilket directory min .class fil er i.
Avatar billede arne_v Ekspert
26. november 2002 - 14:46 #5
Hvis du vil vide hvorfra classloaderen har
loadet din class-fil, så er det straks sværere.

Jeg kan ikke umiddelbart komme på nogen måde at
finde den information på.

Og hvad skulle den returnere, hvis klassen var
dynamisk genereret ?
Avatar billede emileej Nybegynder
26. november 2002 - 14:47 #6
Min class er ikke dynamisk genereret, så det er ikke interessant.
Avatar billede arne_v Ekspert
26. november 2002 - 14:48 #7
Jeg har lige kigger lidt.

Prøv med:

this.getClass().getClassLoader().getSystemResource(this.getClass().getName() + ".class");
Avatar billede arne_v Ekspert
26. november 2002 - 14:53 #8
Det virker ihvertfald for mig med et simpelt test
eksempel.
Avatar billede emileej Nybegynder
26. november 2002 - 14:53 #9
System.out.println(this.getClass().getClassLoader().getSystemResource(this.getClass().getName() + ".class").getPath());
Giver en null-pointer error.

E-)mil
Avatar billede arne_v Ekspert
26. november 2002 - 14:59 #10
Mystisk.

Det virker som sagt fint hos mig.

public class GetPath {
    public static void main(String[] args) {
        GetPath a = new GetPath();
        a.doit();
    }
    private void doit() {
        System.out.println(this.getClass().getClassLoader().getSystemResource(this.getClass().getName() + ".class").getPath());
    }
}
Avatar billede bearhugx Nybegynder
26. november 2002 - 15:00 #11
Et skud fra hoften...

Class klass = this.getClass();

System.out.println( new File( klass.getClassLoader().getSystemRessource( klass.getName()+".class" ) ).getPath());

/Søren Munk Skrøder
Avatar billede arne_v Ekspert
26. november 2002 - 15:01 #12
Testet med både JDK 1.3.1 og 1.4.1.
Avatar billede bearhugx Nybegynder
26. november 2002 - 15:03 #13
Hmm .. ignorer mit indlæg, -- jeg troede at det skulle være nødvendigt at wrappe det inden i et File objekt... :-/

/Søren
Avatar billede bearhugx Nybegynder
26. november 2002 - 15:04 #14
arne_v - din test.class ... ligger den i samme dir, som du exceuter fra... ???
Avatar billede bearhugx Nybegynder
26. november 2002 - 15:06 #15
emil - og hvad nu, hvis du har loadet class-filen fra f.eks. "http://www.skroeder.dk/Test.class" -- så vil du alligevel ikke kunne gemme (da den ligger off-site :-)

/Søren
Avatar billede arne_v Ekspert
26. november 2002 - 15:07 #16
Testet både i samme diretory og i andet directory.
Avatar billede arne_v Ekspert
26. november 2002 - 15:11 #17
Virker mit simple test-eksempel hos jer ?
Avatar billede emileej Nybegynder
26. november 2002 - 15:17 #18
Hvad gør getSystemResource( ?
Min class er en del af nogle packages, så derfor returnerer this.getClass().getName(); "package1.package2.minclass" men filen hedder jo "minclass.class"...

E-)mil
Avatar billede arne_v Ekspert
26. november 2002 - 16:33 #19
package test;

import java.util.StringTokenizer;

public class GetPath {
    public static void main(String[] args) {
        GetPath a = new GetPath();
        a.doit();
    }
    private void doit() {
        String cn = this.getClass().getName();
        StringTokenizer st = new StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
        while(st.hasMoreTokens()) {
            if(first) {
                first = false;
            } else {
                sb.append("/");
            }
            sb.append(st.nextToken());
        }
        sb.append(".class");
        System.out.println(this.getClass().getClassLoader().getSystemResource(sb.toString()).getPath());
    }
}
Avatar billede arne_v Ekspert
26. november 2002 - 16:34 #20
Der er lige en lille krølle med pakke navne !
Avatar billede arne_v Ekspert
26. november 2002 - 16:36 #21
Vær endvidere opmærksom på at jar-file kommer
ud som:
  file:/C:/test.jar!/test/GetPath.class
Avatar billede emileej Nybegynder
26. november 2002 - 16:53 #22
Det ser retti't ud, men jeg kan desværre ikke teste det før næste tirsdag :(

E-)mil
Avatar billede arne_v Ekspert
03. december 2002 - 14:55 #23
Virker det ?
Avatar billede emileej Nybegynder
03. december 2002 - 17:34 #24
Vi skulle på firmabesøg idag :(
Ser om jeg kan komme til at teste torsdag...
Avatar billede arne_v Ekspert
03. december 2002 - 18:05 #25
Jeg venter.
Avatar billede emileej Nybegynder
05. december 2002 - 09:36 #26
Jeg har prøvet at omskrive funktionen, fordi der kommer et ekstra "\" i starten af sti'en, men jeg får en null pointer exception.
Jeg vil desuden gerne slippe for filnavnet, da det kun er mappen - ikke filen, jeg skal have stien til...

    private String getPath(){
        String cn=this.getClass().getName();
        java.util.StringTokenizer st=new java.util.StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
        while(st.hasMoreTokens()){
            if(first)first=false;
            String curr=st.nextToken();
            if(curr!=""){
                if(!first)
                    sb.append("\\");
                sb.append(curr);
            }
        }
        sb.append(".class");
        String path=sb.toString();
        return this.getClass().getClassLoader().getSystemResource(path).getPath();
    }

E-)mil
http://eej.dk
http://hjemmesideservice.dk
Avatar billede arne_v Ekspert
05. december 2002 - 09:48 #27
Jeg tror du skal rette anderleds.

Altså:

    private String getPath() {
        String cn = this.getClass().getName();
        StringTokenizer st = new StringTokenizer(cn,".");
        StringBuffer sb = new StringBuffer("");
        boolean first = true;
        while(st.hasMoreTokens()) {
            if(first) {
                first = false;
            } else {
                sb.append("/");
            }
            sb.append(st.nextToken());
        }
        sb.append(".class");
        String path = this.getClass().getClassLoader().getSystemResource(sb.toString()).getPath();

        // her manipulerer du path så den passer til det format du ønsker

        return path;
    }
Avatar billede emileej Nybegynder
10. december 2002 - 15:28 #28
Tak - tak *knæler i erbødighed* :D
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