Peter Mulholland Ответов: 4

Как использовать специальные папки Windows в пути в конфигурационном файле для сборки C# (4.)?


Я хотел бы иметь возможность установить путь в конфигурационном файле для моей сборки C# 4.0.
Вполне вероятно, что путь будет лежать к одной из специальных папок windows (CommonApplicationData). Однако в моем коде я не хочу предполагать, что в этом пути будет специальная папка, мне просто нужен простой/прямой способ расширить ее, если она есть.

Статический метод класса Path GetFullPath не улавливает окружение.SpecialFolder enum in a string path (я знаю, что это был большой вопрос, но я надеялся)

Поэтому я пошел смотреть на Environment. ExpandEnvironmentVariables, и это привело меня к CSIDL и KNOWNFOLDERID[^].
Мы все еще работаем на XP и добавляем поддержку Widnows 7 (я не думаю, что мы поддерживаем Vista)

Поэтому я полагаю, что мог бы поместить %CSIDL_COMMON_APPDATA% в путь в моем конфигурационном файле и использовать ExpandEnvironmentVariable (), предполагая, что я не устанавливаю Windows 7, и в этом случае я предполагаю, что мой установщик должен обновить конфигурационные файлы, чтобы использовать "Folderid_programmdata".

Именно так я должен решать эту проблему?
Есть ли лучшая практика для этого, которую я пропустил?

1. Как я должен представлять специальную папку windows в строке пути в конфигурационном файле?
2. Как мне расширить это представление в полный путь в моем коде?

Любой совет приветствуется, спасибо.

[Осветление]
Судя по реакции JSOPs это, наверное, просто выдаете желаемое за действительное, но я думал, я хотел бы уточнить, что именно я пытаюсь добиться:

Я понимаю окружающую среду.Перечисление SpecifalFolder и как использовать среду.Метод GetFolderPath, я даже могу преобразовать строковое представление специальной папки в путь:
Environment.GetFolderPath((Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), mySpecialFolder))


Я стараюсь не разбивать свой путь на 2 части в конфигурации и не иметь дело с частью "SpecialFolder" отдельно, потому что на самом деле мы не можем использовать специальную папку.
Я хотел бы иметь возможность настроить свой путь следующим образом:
"C:\MyCompanyName\MyAppName\MyFolder"

или
"C:\Documents and Settings\All User\Application Data\MyCompanyName\MyAppName\MyFolder"

Но я бы предпочел не раскрывать явно специальную папку в конфигурационном файле.

Я хотел бы иметь возможность войти:
"%CSIDL_COMMON_APPDATA%\MyCompanyName\MyAppName\MyFolder"

или
"%FOLDERID_ProgramData%\MyCompanyName\MyAppName\MyFolder"

или
"%System.Environment.SpecialFolder.CommonApplicationData%\MyCompanyName\MyAppName\MyFolder"

или там, где мы не используем специальную папку, введите просто:
"C:\MyCompanyName\MyAppName\MyFolder"


И я спрашиваю, есть ли библиотечный метод, который позволит мне автоматически расширять % обернутые биты в пути (и это не упадет, если нет % искаженных битов)?

Я предполагаю из более раннего ответа JSOPs, что его нет.
[/Осветление]

Philippe Mori

Для папок Vista по сути похожа на Windows 7, поэтому нет никаких причин не поддерживать Vista, если вы поддерживаете XP.

4 Ответов

Рейтинг:
2

Sergey Alexandrovich Kryukov

Воспользуйся System.Environment.GetFolderPath(Environment.SpecialFolder) или System.Environment.GetFolderPath(Environment.SpecialFolder, Environment.SpecialFolderOption). В вашем случае используйте System.Environment.SpecialFolder.CommonApplicationData или System.Environment.SpecialFolder.LocalApplicationData для первого параметра.

Видеть:
http://msdn.microsoft.com/en-us/library/system.environment.getfolderpath.aspx[^],
http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx[^],
http://msdn.microsoft.com/en-us/library/system.environment.specialfolderoption.aspx[^].

—СА


Рейтинг:
1

Daniel Balogh

Если кто-то наткнется на это (как я):

Environment. ExpandEnvironmentVariables(%VARNAME%\subpath)

от:
StackOverflow[^]

BR,
Даниил


Graeme_Grant

Почему вы отвечаете на вопрос 6-летней давности?

CHill60

Что вы пытаетесь добавить к этой теме? ОП уже знал о ExpandEnvironmentVariables и упоминает об этом в своем 6 - летнем вопросе

Daniel Balogh

Извините, я наблюдал за вами в ОП-вопросе.... Почему через 6 лет? Я нашел его сейчас и предполагаю, что кто-то еще может найти эту нить сейчас или в будущем...
Но вы правы, он знал о предлагаемом решении.... Еще раз прошу прощения...
BR

Рейтинг:
0

#realJSOP

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

//--------------------------------------------------------------------------------
public static string CreateAppDataFolder(System.Environment.SpecialFolder specialFolder, string folderName)
{
    string appDataPath  = "";
    string dataFilePath = "";
    folderName          = folderName.Trim();
    if (folderName != "")
    {
        try
        {
            appDataPath = System.Environment.GetFolderPath(specialFolder);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        if (folderName.Contains("\\"))
        {
            string[] path = folderName.Split('\\');
            int folderCount = 0;
            int folderIndex = -1;
            for (int i = 0; i < path.Length; i++)
            {
                string folder = path[i];
                if (folder != "")
                {
                    if (folderIndex == -1)
                    {
                        folderIndex = i;
                    }
                    folderCount++;
                }
            }
            if (folderCount != 1)
            {
                throw new Exception("Invalid folder name specified (this function only creates the root app data folder for the application).");
            }
            folderName = path[folderIndex];
        }
    }
    if (folderName == "")
    {
        throw new Exception("Processed folder name resulted in an empty string.");
    }
    try
    {
        dataFilePath = System.IO.Path.Combine(appDataPath, folderName);
        if (!Directory.Exists(dataFilePath))
        {
            Directory.CreateDirectory(dataFilePath);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    AppDataFolder = dataFilePath;
    return dataFilePath;
}


Рейтинг:
0

E.F. Nijboer

Это можно сделать очень легко, проверьте это:

http://technet.microsoft.com/nl-nl/library/ee176604%28en-us%29.aspx[^]

Другое отношение:
Доступ ко всем специальным папкам Windows[^]

Удачи вам!