Как программно ссылаться на каталог C: \ Users \ Public в C # - PullRequest
16 голосов
/ 10 января 2011

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

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

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

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

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

Ответы [ 6 ]

16 голосов
/ 10 января 2011

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

// 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;
14 голосов
/ 10 января 2011

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

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

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

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

6 голосов
/ 12 марта 2012

Обратите внимание, что 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 голосов
/ 10 января 2011

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

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

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

Т.е.

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
4 голосов
/ 10 января 2011

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

Environment.GetFolderPath(SpecialFolder.CommonApplicationData)

Также рассмотрите возможность использования Path.Combine для объединения элементов в новый путь:

Path.Combine(
    Environment.GetFolderPath(SpecialFolder.CommonApplicationData),
    "MyCompanyName")
2 голосов
/ 26 октября 2017

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

Windows-> Пуск -> 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);
}
...