Answer to original question
A directory is a location in the file system. A folder is a location in the shell namespace. A directory is a kind of folder. A virtual folder is not necessarily backed by a directory. For example consider libraries or search folders.
The user’s desktop directory is a location in the file system. The desktop folder merges that with virtual items like all users items, recycle bin, shortcut to documents folder etc.
Additional question and answer pulled from comments
Question
(by Lei Yang) Why is the following always true:
Environment.GetFolderPath(Environment.SpecialFolder.Desktop) == Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
Answer
(by David Heffernan):
The answer addresses the two specific questions asked. It doesn’t attempt to address the issue you raise. If you look at the two CSIDL enum values that correspond to the two .net special folder values you will see that they map to the same known folder guid. This suggests to me that in older versions of Windows there was a difference but that has changed.
See https://learn.microsoft.com/en-us/windows/win32/shell/csidl
Ctrl+F
for “FOLDERID_Desktop”