AppDirs Instance¶
To get an AppDirs
instance, you need to get it from
AppDirsFactory::getInstance
. See example below:
val appDirs: AppDirs = AppDirsFactory.getInstance()
Note
Since it is assumed that the operating system cannot be changed during
the runtime, AppDirsFactory::getInstance
will lazily instantiate an
AppDirs
instance, which means the second time you call it, you will
get the reference to the same object.
Methods¶
Every AppDirs
instance contains the methods and their signatures below:
getUserDataDir( appName: String, appVersion: String, appAuthor: String? = null, roaming: Boolean = false ): Path getUserConfigDir( appName: String, appVersion: String, appAuthor: String? = null, roaming: Boolean = false ): Path getUserCacheDir( appName: String, appVersion: String, appAuthor: String? = null ): Path getUserLogDir( appName: String, appVersion: String, appAuthor: String? = null ): Path getUserDownloadsDir(): Path getUserDesktopDir(): Path getUserDocumentsDir(): Path getUserMusicDir(): Path getUserPicturesDir(): Path getUserVideosDir(): Path getSiteDataDir( appName: String, appVersion: String, appAuthor: String? = null, local: Boolean = false ): Path getSiteConfigDir( appName: String, appVersion: String, appAuthor: String? = null ): Path
As an example:
val appDirs: AppDirs = AppDirsFactory.getInstance() val APP_NAME = "myApp" val APP_VERSION = "0.1.0" val APP_AUTHOR = "myName" // or the organization name val userDataDir: Path = appDirs.getUserDataDir(APP_NAME, APP_VERSION, APP_AUTHOR) val userConfigDir: Path = appDirs.getUserConfigDir(APP_NAME, APP_VERSION, APP_AUTHOR) val userCacheDir: Path = appDirs.getUserCacheDir(APP_NAME, APP_VERSION, APP_AUTHOR) val userLogDir: Path = appDirs.getUserLogDir(APP_NAME, APP_VERSION, APP_AUTHOR) val userDownloadsDir: Path = appDirs.getUserDownloadsDir() val userDesktopDir: Path = appDirs.getUserDesktopDir() val userDocumentsDir: Path = appDirs.getUserDocumentsDir() val userMusicDir: Path = appDirs.getUserMusicDir() val userPicturesDir: Path = appDirs.getUserPicturesDir() val userVideosDir: Path = appDirs.getUserVideosDir() val siteDataDir: Path = appDirs.getSiteDataDir(APP_NAME, APP_VERSION, APP_AUTHOR) val siteConfigDir: Path = appdirs.getSiteConfigDir(APP_NAME, APP_VERSION, APP_AUTHOR)
getUserDataDir
and getUserConfigDir
methods (first two above) have one
extra argument called roaming
, which is false
by default. As an example:
// roaming examples val userDataDir: Path = appDirs.getUserDataDir(APP_NAME, APP_VERSION, APP_AUTHOR, roaming = true) val userConfigDir: Path = appDirs.getUserConfigDir(APP_NAME, APP_VERSION, APP_AUTHOR, roaming = true)
Note
Practically, roaming
argument only has effect on Windows machines.
To get more information about roaming
, check out this part
of Windows section of the documentation.
Also, getSiteDataDir
method has one extra argument called local
, which
isfalse
by default. As an example:
// local example val siteDataDir: Path = appDirs.getSiteDataDir(APP_NAME, APP_VERSION, APP_AUTHOR, local = true)
Note
Practically, local
argument only has effect on XDG-compliant
Unix based or inspired systems (including XDG-compliant Linux). To get
more information about local
, see Unix section of
the documentation.
The Purpose of Directories¶
The application directories have different purposes. How they work also differs on the operating system your application runs. You can see how they differ on operating system sections, yet they also have a common convention as well. In this section, we will discuss how they differ in common, but keep in mind that these methods are based on a convention, which means you can break the conventions any time you want, but it is just easier to keep it alive.
User versus Site Methods¶
The user application directory methods in kappdirs
are as below:
getUserDataDir
getUserConfigDir
getUserCacheDir
getUserLogDir
getUserDownloadsDir
getUserDesktopDir
getUserDocumentsDir
getUserMusicDir
getUserPicturesDir
getUserVideosDir
The site application directory methods, on the other hand, are as below:
getSiteDataDir
getSiteConfigDir
User-based methods point at the directories which the user that is running your application owns and/or has full access to read/write/execute by default. So, naturally and usually, reading from, writing to or executing the files in these directories will not create any problem or extra-care for your application. You usually need to store data based on a particular user in these directories.
On the other hand, site-based methods point at system-wide directories. Your user might or might not have specific permissions to these directories. You usually need to store system-wide data in these directories which will naturally effect the other users in the same machine.
Data versus Config Methods¶
The data application directory methods in kappdirs
are as below:
getUserDataDir
getSiteDataDir
And the config application directory methods are as below:
getUserConfigDir
getSiteConfigDir
The distinction in the names are clear. Data application directories contain the data for your application while config directories contain the config files.
To give an example, consider a game. In this context, getUserDataDir
method points to the directory where the current user's save files are
stored while getUserConfigDir
method points to the directory how the user
wants the game to behave, like the resolution for the game or user-specific
control-schemes.
Note
Also, in this example, you do not need getSiteDataDir
or
getSiteConfigDir
method. You usually do not need to use these methods,
especially in writing operations. It is a good practice to write into
system-wide (site) directories on installation process of your
application and with proper permissions and then, you do reading
operations from these directories.
Cache Method¶
Cache directory can be acquired via getUserCacheDir
method. It is used to
store the files that is acquired after a heavy operation.
For example, network operations are considered heavy operations since you need to write to and read from socket in low level. If your application downloads an asset such as an image, a video or an audio from the internet, it does not need to download these again in the next operation. Instead, it can save these assets into cache directory and read them on.
Another example is where you need to generate an image programmatically. Imagine a scenario where you detect the face and properly crop for a profile picture. Instead of doing it again and again and wasting CPU/GPU resources, you can save the image to the cache directory and use it in the next run.
Cache directory is only a user directory because users create caches and you cannot always rely on caches (meaning that they are not intended to be persistent data). For example, if the cached resource that your program is looking for is not in its place, you will likely need to redownload or regenerate and, in the end, recache your resource.
Log Method¶
Log directory can be acquired via getUserLogDir
method. It is used to
dump the logs that your application generates.
Logging is a good practice to debug your application on different machines and, in case of an issue, you can easily grab the log files and look for the issue.
Log directory is only a user directory. Keep in mind that you might need to clear the older logs from time to time in order not to bloat the drive of the machine that your application runs on.
Extra User Application Directories¶
Extra user application directories are new user-based directories that you can use. These methods are as below:
getUserDownloadsDir
getUserDesktopDir
getUserDocumentsDir
getUserMusicDir
getUserPicturesDir
getUserVideosDir
The common point that these methods share is that they require zero argument, which means you can use one of them as below:
val downloadsDir: Path = appDirs.getUserDownloadsDir()
That is intended because there is no convention about how to use or utilize these directories, so if you want to use your application name as a child, you should do it manually as below:
val appDownloadDir: Path = Paths.get(downloadsDir, "myApp")