Java windows appdata directory

How to get local application data folder in Java? [duplicate]

I’m looking for a way to get the location of the local application data folder, which is a special Windows folder, in Java. Unfortunately, the following only works for English versions of Windows XP with default settings:

What I’d like to have is something like this in .NET:

Is there a way to do it without having to call SHGetSpecialFolderLocation of the Windows Shell API?

7 Answers 7

Reading the «Shell Folders» registry key is deprecated starting from Windows 95. The registry key contains a note saying «!Do not use this registry key. Use the SHGetFolderPath or SHGetKnownFolderPath instead.» I had to find this out the hard way on a Vista system where all the keys were missing except for the warning note.

This related stackoverflow answer solves this problem on Windows using JNA, which is the solution I’m currently using.

(there seems to be no env variable for the «Local Settings» folder, but this will give you the ‘Application Data’ folder)

what about the following

I have a situation where this is NOT under «user.home»

I would like to use the following two ways:

You could read the path from the registry: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\* where * is one of those Keys:

  • Local AppData ( C:\Documents and Settings\USER\Local Settings\Application Data )
  • Local Settings ( C:\Documents and Settings\USER\Local Settings )
  • AppData ( C:\Documents and Settings\USER\Application Data )

Note: Those example paths are from an english Windows XP installation

Зачем нужна и где расположена папка AppData в Windows?

В этой статье о папке AppData: где расположена и как найти папку AppData, за что отвечают папки Local, LocalLow, и Roaming . Приложения Windows часто хранят свои данные и файлы настроек в папке AppData. Причём, AppData есть в папке каждого пользователя конкретного компьютера. По умолчанию папка AppData является скрытой, и увидеть её можно только отобразив скрытые файлы и папки.

Как найти папку AppData

Для аккаунта каждого пользователя Windows есть своя папка AppData, и содержит она данные именно того пользователя в папке которого находится. Это даёт возможность программам и приложениям Windows хранить несколько вариантов настроек на компьютере, который одновременно используется несколькими пользователями.

Папка AppData (что является сокращением от Application Data) впервые появилась в Windows Vista и присутствует во всех современных версиях операционной системы: Windows 7, 8 и 10.

Найти AppData можно в папке с именем пользователя. Так, в папке моего пользователя с именем Valery папка AppData расположена по адресу:

Как уже упоминалось выше, по умолчанию данная папка является скрытой. Но если в адресную строку файлового менеджера вбить %APPDATA% и нажать Enter, то откроется AppData текущего пользователя.

Папки Local, LocalLow, и Roaming

Папка AppData включает в себя три папки: Local, LocalLow, и Roaming. Разные программы и приложения хранят разные типы настроек и своих данных в каждой из них.

Roaming

Папка Roaming состоит из данных, которые переходят за пользователем от одного компьютера к другому, по причине их синхронизации или если компьютер подсоединён к домену с роумингом профайла. Часто – это важные данные и настройки приложений.

Например, вы здесь найдёте профайл пользователя Google Chrome, Mozilla Firefox и Opera, в которых сохранены закладки и другие данные браузера, которые переходят вместе с пользователем от компьютера к компьютеру. Также здесь хранятся некоторые данные аккаунтов Viber, Skype, антивирусных программ и виртуальных машин.

Local

В папке Local хранятся данные, которые относятся к одному конкретному компьютеру. Они никогда не синхронизируются с другими ПК, даже если компьютер находится в домене. Это специфические данные для конкретного компьютера или файлы большого размера. Это может быть кэш программ и приложений или настройки, синхронизация которых разработчиками не предусмотрена.

Читайте также:  Wlan driver для windows 10

Если компьютер не находится в сети, то большой разницы между папками Roaming и Local не будет. Все данные будут хранится только на ПК. Тем не менее, данные таких папок по умолчанию разделяются разработчиками приложений.

LocalLow

Папка LocalLow предназначена для сохранения данных приложений со «слабой интеграцией» (“low integrity”). Таких, которые работают с более ограниченными настройками безопасности. Она предназначена в основном для буферных данных, генерируемых Internet Explorer, Java и программами от Adobe. Например, при использовании браузера в защищённом режиме или режиме инкогнито, он будет иметь доступ только к папке LocalLow.

Если программе или приложению требуется иметь один набор настроек или данных для нескольких или всех пользователей компьютера, то для этого будет использована папка ProgramData. В более ранних версиях Windows для этого использовалась папка AppdData пользователя «Общие» (“All Users”).

Антивирусные программы, например, в папке ProgramData сохраняют логи сканирования и настройки, которые являются общими для всех пользователей.

Но бывают и исключения. Например, Google Chrome хранит все свои настройки и данные пользователя в папке Local. Хотя, теоретически, такие данные должны храниться в папке Roaming. И такие случаи не единичны.

Так, некоторые приложения хранят настройки в корневой папке аккаунта пользователя ( C:\Пользователи\ИмяПользователя\ ), или в документах ( C:\Пользователи\ИмяПользователя\Документы ). Другие, могут хранить свои данные в любом другом месте системы. В Windows, разработчики приложений имеют возможность настраивать их таким образом, что данные будут хранится в любом удобном месте.

Нужно ли резервировать и можно ли удалять данные папки AppData

Большинство пользователей Windows даже не подозревает о существовании папки AppData. Рядовому пользователю компьютера знать о ней нет необходимости. Поэтому она и является скрытой по умолчанию. Данная папка предназначена для хранения программами и приложениями в ней своих служебных данных, и пользователи как правило обращаются к ней только в случае крайней необходимости.

В принципе, необходимости делать резервную копию всей папки нет необходимости. Тем не менее, в ней хранится вся история переписок большинства мессенджеров (как Viber, Skype или Messenger), а также история некоторых браузеров (как Google Chrome). В резервном копировании таких данных, смысл конечно же есть.

И наоборот, в случае удаления или утери одной из папок в AppData, пользователь рискует утерять доступ к важным данным того или иного приложения.

Резервное копирование данных программ и приложений, которые хранятся в AppData, часто сводится к простому копированию их в другое место. Для того, чтобы восстановить их, папку с такими данными достаточно скопировать обратно в то же место папки AppData другого или нового компьютера. В результате, программа или приложение будут использовать данные или настройки из созданной раннее резервной копии.

Только имейте ввиду, что то, будет ли программа корректно использовать данные из резервной копии зависит от свойств каждого отдельного приложения.

Исходя из описанного выше, рекомендуем не вносить никаких изменений в папку AppData если вы не уверены в своих действиях на сто процентов и без крайней на то необходимости.

Getting My Documents path in Java

I need to find my documents path using Java. The following code doesn’t give me «accurate» loation

What should be the other way around?

P.S: I don’t want to use the JFileChooser Dirty trick.

8 Answers 8

You can get it using a registry query, no need for JNA or admin rights for that.

Obviously this will fail on anything other than Windows, and I am not certain whether this works for Windows XP.

EDIT: Put this in a working sequence of code:

Note this will lock the process until «reg query» is done, which might cause trouble dependeing on what you are doing.

That’s easy, JFileChooser finds it for you

I hope this helps someone

Since the most upvoted answer from @xchiltonx uses JFileChooser I would like to add that, regarding performance, this is faster than using JFileChooser :

Читайте также:  Как перенести dhcp windows

In my PC, JFileChooser aproach needed 300ms, and calling FileSystemView directly needed less than 100ms.

Note: The question is a possible duplicate of How to find “My Documents” folder in Java

Note in 2020: The ShellFolder class seems to be missing on Linux (tested with openjdk8), so IvanRF’s answer is likely better.

Original answer:

The best way I’ve found is to use AWTs:

I have redirected my Documents folder to the D: drive, and it successfully fetches this directory. It also does so in about 40 ms (on my machine). Using FileSystemView takes about 48 ms, and new JFileChooser() about 250 ms.

All three of these methods actually use ShellFolder under the hood, and the difference with FileSystemView is negligible, but calling it directly avoids the overhead of the other two.

Note: You can also cast this directly to File instead of implicitly getting the toString() method of it, which can help you further:

How to create a temporary directory/folder in Java?

Is there a standard and reliable way of creating a temporary directory inside a Java application? There’s an entry in Java’s issue database, which has a bit of code in the comments, but I wonder if there is a standard solution to be found in one of the usual libraries (Apache Commons etc.) ?

18 Answers 18

If you are using JDK 7 use the new Files.createTempDirectory class to create the temporary directory.

Before JDK 7 this should do it:

You could make better exceptions (subclass IOException) if you want.

The Google Guava library has a ton of helpful utilities. One of note here is the Files class. It has a bunch of useful methods including:

This does exactly what you asked for in one line. If you read the documentation here you’ll see that the proposed adaptation of File.createTempFile(«install», «dir») typically introduces security vulnerabilities.

If you need a temporary directory for testing and you are using jUnit, @Rule together with TemporaryFolder solves your problem:

The TemporaryFolder Rule allows creation of files and folders that are guaranteed to be deleted when the test method finishes (whether it passes or fails)

Update:

If you are using JUnit Jupiter (version 5.1.1 or greater), you have the option to use JUnit Pioneer which is the JUnit 5 Extension Pack.

For example, the following test registers the extension for a single test method, creates and writes a file to the temporary directory and checks its content.

Update 2:

The @TempDir annotation was added to the JUnit Jupiter 5.4.0 release as an experimental feature. Example copied from the JUnit 5 User Guide:

Naively written code to solve this problem suffers from race conditions, including several of the answers here. Historically you could think carefully about race conditions and write it yourself, or you could use a third-party library like Google’s Guava (as Spina’s answer suggested.) Or you could write buggy code.

But as of JDK 7, there is good news! The Java standard library itself now provides a properly working (non-racy) solution to this problem. You want java.nio.file.Files#createTempDirectory(). From the documentation:

Creates a new directory in the specified directory, using the given prefix to generate its name. The resulting Path is associated with the same FileSystem as the given directory.

The details as to how the name of the directory is constructed is implementation dependent and therefore not specified. Where possible the prefix is used to construct candidate names.

This effectively resolves the embarrassingly ancient bug report in the Sun bug tracker which asked for just such a function.

Блог did5.ru

Про АйТи и около айтишные темы

Установка и настройка Java с помощью групповых политик

Подробно описывать процесс развертывание софта с помощью групповых политик не буду, т.к. в интернете полно инструкций на эту тему. Расскажу только про проблемы, с которыми мне пришлось столкнуться и как я их решил.

Читайте также:  Windows sp3 gamers edition

Для развертывания программ с помощью групповых политик нужно иметь дистрибутив с расширением MSI этого софта. С официального сайта Oracle можно скачать только EXEшник Java. Но как добыть MSI из этого EXEшника я уже рассказывал — Где скачать MSI установщик JAVA.

На этом этапе будем считать, что Вы настроили групповую политику для установке Java на парке компьютеров и она работает.

На данный момент последняя версия Java 7 update 25, но я буду развертывать Java 6 с последним update 45. Мне стало интересно, что будет, если на ПК уже установлена Java, например, с update 11, или Java 7. После экспериментов выяснил, что 6-я версия Java с последним апдейтом заменяет собой все предыдущие апдейты, т.е. Java обновляется. С 7-й версией хуже, в этом случаем Java 6 ставится параллельно, а через иконку Java в панели управления можно управлять только 7-й версией и IE работает с ней. В этом случае нужно продумывать механизм удаления Java 7, чтобы полноценно пользоваться 6-ой.

Установка сертификатов в хранилище Java

У меня была задача добавить несколько корпоративных сертификатов (corp.cer, corp1.cer) в хранилище Java Signer CA в разделе System.

Импорт можно сделать только с помощью программы keytool.exe. Для этого открываем cmd.exe от имени администратора и вводим следующую команду (но предварительно нужно изменить параметры -alias и -keystore под себя):

«C:\Program Files\Java\jre6\bin\keytool.exe» -importcert -alias CorpIntCA01 -file «D:\install\CorpIntCA01.cer» -trustcacerts -keystore «C:\Program Files\Java\jre6\lib\security\cacerts» -storepass changeit –noprompt

И так для каждого сертификата.

Понятно, что данный способ развертывания сертификатов Java использовать очень неудобно, поэтому пойдем другим путем. На одном ПК добавим все сертификаты, а потом файл, в котором они хранятся, перепишем на все ПК с помощью групповой политики (GPO), а точнее с помощью предпочтений групповой политики (GPP).

Файл с сертификатами называется cacerts и находится в каталоге — C:\Program Files\Java\jre6\lib\security\.

Я использовал ту же групповую политику, что и для развертывания Java. Далее делаем так, как показано на скриншоте.

В поле Source указываем имя сервера, где будет лежать файл cacerts (\\fileserver\java_settings\cacerts), в поле Destination File указываем путь к конечному файлу — %ProgramFilesDir%\Java\jre6\lib\security\cacerts.

Единственная проблема возникает при установке Java, т.к. файл скопируется быстрее, чем установится Java. А при установке Java сотрет уже имеющийся файл с нашими сертификатами, и на его место запишет свой файл с сертификатами по умолчанию. GPP отработает снова через некоторое время, файл заменится снова, но не сразу. К этому нужно быть готовым.

Если нужно развернуть сертификаты из раздела пользователя, то действуем по такому же принципу.

Файл с сертификатами Trusted Certificates из раздела User называется trusted.certs и находится в профайле пользователя в каталоге — C:\Documents and Settings\%User%\Application Data\Sun\Java\Deployment\security.

Подробное описание типов сертификатов Java есть на оф.сайте.

Отключаем назойливые предупреждения

Предупреждения безопасности вещь хорошая, но часто очень раздражает. Поэтому нужно отключить надоедливые предупреждения, про которые все и так уже знают.

При работе сервиса EMC Documentum вылезает сообщение, что приложение содержит неподписанный код, но т.к. мы им доверяем, то постоянно видеть это предупреждение не нужно.

Warning Security: Java has discovered application components that could indicate a security concern. Block potentially unsafe components from being run?

Через консоль в Панели управления можно отключить так:

А чтобы изменить этот параметр сразу у всех, опять обратимся к предпочтения групповой политики GPP. Эти настройки Java находятся в файле deployment.properties в профайле пользователя — C:\Documents and Settings\%User%\Application Data\Sun\Java\Deployment. Как и в прошлый раз, выставляем все настройки через консоль, а потом копируем этот файл на файловый сервер и настраиваем GPO.

Source – указываем файловый сервер, где будет лежать исходный файла (\\fileserver\java_settings\deployment.properties), а в Destination File — %userprofile%\AppData\LocalLow\Sun\Java\Deployment\deployment.properties — это для Windows 7, а для Windows XP — %AppData%\Sun\Java\Deployment\deployment.properties.

Нашли опечатку в тексте? Пожалуйста, выделите ее и нажмите Ctrl+Enter! Спасибо!

Хотите поблагодарить автора за эту заметку? Вы можете это сделать!

Оцените статью