Hoe u lokale applicatiegegevensmap in Java kunt krijgen?

mogelijk Duplicaat:
Wat is De verknopingsplaats voor het verkrijgen van het pad naar de Local Application Data Directory?

Ik ben op zoek naar een manier om de locatie van de lokale applicatiegegevensmap te krijgen, die een speciale Windows-map is, in Java.
Helaas werkt het volgende alleen voor Engelse versies van Windows XP met standaardinstellingen:

System.getProperty("user.home") + "\\Local Settings\\Application Data"

Wat ik zou willen hebben is zoiets in .NET:

System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

Is er een manier om het te doen zonder te bellen ShgetSpecialFolderLocatie van de Windows Shell API?


Antwoord 1, Autoriteit 100%

System.getenv("APPDATA")

(er lijkt geen env-variabele te zijn voor de map “Lokale instellingen”, maar dit geeft u de map ‘Toepassingsgegevens’)


Antwoord 2, Autoriteit 20%

Hoe zit het met het volgende

String dataFolder = System.getenv("LOCALAPPDATA");

Ik heb een situatie waarin dit niet onder “gebruiker.home”

staat


Antwoord 3, Autoriteit 16%

Het lezen van de registersleutel “Shell Folders” is afgeweken vanaf Windows 95. De registersleutel bevat een opmerking: “! Gebruik deze registersleutel niet. Gebruik in plaats daarvan de SHGERFOLDERPAD of SHGERNOWNFOLDERPAD.” Ik moest dit op de harde manier vinden op een Vista-systeem waar alle sleutels ontbraken, behalve de waarschuwing.

Deze bijbehorende stapelaars Antwoord lost dit probleem op op Windows met JNA, dat is de oplossing die ik momenteel gebruikt.


Antwoord 4, Autoriteit 4%

Ik wil graag de volgende twee manieren gebruiken:

String dataFolder = System.getenv("APPDATA");
String dataFolder = System.getProperty("user.home") + "\\Local Settings\\ApplicationData";

Antwoord 5

U kunt het pad van het register lezen: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\*waar *is een van die toetsen:

  • Lokale appData (C:\Documents and Settings\USER\Local Settings\Application Data)
  • Lokale instellingen (C:\Documents and Settings\USER\Local Settings)
  • APPDATA (C:\Documents and Settings\USER\Application Data)

Opmerking: die voorbeeldpaden komen uit een Engelse Windows XP-installatie


Antwoord 6

Ik heb op deze manier opgelost

private static File getAppData(){
    ProcessBuilder builder = new ProcessBuilder(new String[]{"cmd", "/C echo %APPDATA%"});
    BufferedReader br = null;
    try {
        Process start = builder.start();
        br = new BufferedReader(new InputStreamReader(start.getInputStream()));
        String path = br.readLine();
        // TODO HACK do not know why but I get an extra '"' at the end
        if(path.endsWith("\"")){
            path = path.substring(0, path.length()-1);
        }
        return new File(path.trim());
    } catch (IOException ex) {
        Logger.getLogger(Util.class.getName()).log(Level.SEVERE, "Cannot get Application Data Folder", ex);
    } finally {
        if(br != null){
            try {
                br.close();
            } catch (IOException ex) {
                Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    return null;
}

Antwoord 7

Het zou mogelijk zijn om een proces te starten om de sleutel op te vragen en vervolgens de uitvoer te ontleden:

REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Local AppData"

Eerlijk gezegd zou ik echter eerder geneigd zijn om JNA of JNI te gebruiken.

Other episodes