-
Notifications
You must be signed in to change notification settings - Fork 6.1k
Description
Description
What version of .NET introduced the breaking change?: .NET 8 Preview 1
Starting with .NET 8, the behavior of Environment.GetFolderPath on Unix operating systems has changed according to the following previous and new behavior tables below.
See dotnet/runtime#68610 and dotnet/runtime#76250
Version
Other (please put exact version in description textbox)
Previous behavior
Linux Behavior
| SpecialFolder value | Path |
|---|---|
MyDocuments / Personal (different name, same value) |
$HOME |
macOS Behavior
| SpecialFolder value | Path |
|---|---|
MyDocuments / Personal (different name, same value) |
$HOME |
ApplicationData |
$HOME/.config |
LocalApplicationData |
$HOME/.local/share |
MyVideos |
$HOME/Videos |
Android Behavior
| SpecialFolder value | Path |
|---|---|
MyDocuments / Personal (different name, same value) |
$HOME |
New behavior
Linux Behavior
| SpecialFolder value | Path |
|---|---|
MyDocuments / Personal (different name, same value) |
Uses XDG_DOCUMENTS_DIR, if available. $HOME/Documents otherwise |
macOS Behavior
| SpecialFolder value | Path |
|---|---|
MyDocuments / Personal (different name, same value) |
NSDocumentDirectory ($HOME/Documents) |
ApplicationData |
NSApplicationSupportDirectory (Library/Application Support) |
LocalApplicationData |
NSApplicationSupportDirectory (Library/Application Support) |
MyVideos |
NSMoviesDirectory ($HOME/Movies) |
Android Behavior
| SpecialFolder value | Path |
|---|---|
MyDocuments / Personal (different name, same value) |
$HOME/Documents |
Type of breaking change
- Binary incompatible: Existing binaries may encounter a breaking change in behavior, such as failure to load/execute or different run-time behavior.
- Source incompatible: Source code may encounter a breaking change in behavior when targeting the new runtime/component/SDK, such as compile errors or different run-time behavior.
Reason for change
The previous behavior was incorrect and not consistent with Linux / macOS / Android users' expectations.
Recommended action
The most common break is using Environment.GetFolderPath(Environment.SpecialFolder.Personal) on Unix to get the $HOME directory. Environment.SpecialFolder.Personal and Environment.SpecialFolder.Documents are aliases for the same underlying enum value. If you are using SpecialFolder.Personal in this way, it is recommended to change your code to Environment.GetFolderPath(Environment.SpecialFolder.UserProfile).
For other breaks, the recommended action is to either
- Migrate your application's files to the appropriate directory
- or -- Add a fallback check for the previous location to your code
Feature area
Core .NET libraries
Affected APIs
namespace System;
class Environment:
public static string GetFolderPath (Environment.SpecialFolder folder); - Doc link
public static string GetFolderPath (Environment.SpecialFolder folder, Environment.SpecialFolderOption option); - Doc link