Как программно ссылаться на каталог C:\Users\Public в С#

Безопасно ли программно ссылаться на общую папку через:

Directory = System.Environment.GetEnvironmentVariable("public")+"MyCompanyName" // etc.

или есть лучший способ?

Опять же, что, если кто-то удаляет переменную окружения для публики и безопасно ли это использовать для разных языковых ОС?

Это следует: Как установить в общий каталог в Windows 7 из проекта установки развертывания VS 2010

Ответ 1

Это зависит от того, чего вы хотите достичь. Существует перечисление, называемое SpecialFolder. Вы можете использовать его для получения Пути к некоторым Каталогам. Например:

System.Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory)

указывает на "C:\Users\Public\Desktop".

ИМХО, ваш путь не ошибается, хотя я бы сделал некоторую обработку исключений в случае, если EnvVar действительно отсутствует. Также вы можете использовать ENUM с "CommonDesktopDirectory" и избавиться от части "\ Desktop".

Ответ 2

Это кажется немного сомнительным, но оно должно работать:

// This should give you something like C:\Users\Public\Documents
string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);

var directory = new DirectoryInfo(documentsPath);

// Now this should give you something like C:\Users\Public
string commonPath = directory.Parent.FullName;

Ответ 3

Обратите внимание, что файл Environment.SpecialFolder.CommonDesktopDirectory доступен только в .NET 4.0. Для моих систем .NET 3.5 (Windows 7 или XP) я использовал раздел реестра для папок оболочки. Мой фрагмент кода находится в VB.NET.

Private mRegShellPath="Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
Private mCommonDesktop = Nothing

' dgp rev 3/8/2012
Private ReadOnly Property CommonDesktop As String
    Get
        If mCommonDesktop Is Nothing Then
            Dim RegKey As RegistryKey
            Try
                RegKey = Registry.LocalMachine.OpenSubKey(mRegShellPath, False)
                mCommonDesktop = RegKey.GetValue("Common Desktop")
            Catch ex As Exception
                mCommonDesktop = ""
            End Try
        End If

        Return mCommonDesktop
    End Get

End Property

Ответ 4

Вы посмотрели на это?

http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

Задает перечисляемые константы, используемые для получения путей каталога к системным специальным папкам.

Т.е

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

Ответ 5

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

Environment.GetFolderPath(SpecialFolder.CommonApplicationData)

Кроме того, рассмотрите возможность использования Path.Combine для объединения элементов для формирования нового пути:

Path.Combine(
    Environment.GetFolderPath(SpecialFolder.CommonApplicationData),
    "MyCompanyName")

Ответ 6

Вы можете получить все эти% -ные символы% wildcard, просмотрев

Windows- > Start → Regedit →

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

Затем вы выполняете

using System;
string path2Downloads = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads");

string path2Music = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Music");

... и так далее.... и проверить:

using System.IO;

string[] files = { "" };
if (Directory.Exists(path2Music)) {
    files = Directory.GetFiles(path2Music);
}