Как я могу защищаться от потенциальных неортодоксальных букв на жестком диске?
Я могу установить свойство InitialDirectory в SaveFileDialog, где мое приложение будет обычно устанавливаться следующим образом:
saveFileDialog1.InitialDirectory = @"C:\Program Files\Waltons\Mountains";
... но так как "в каждой толпе есть один", некоторые могут использовать букву диска, отличную от C, для своего жесткого диска? Как я могу установить InitialDirectory на ту букву диска, которую указал пользователь?
ОБНОВИТЬ
Я попробовал код Алексея (пришлось изменить "Concat" на "Combine" и удалить лишнее ")":
saveFileDialog1.InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), @"Waltons\Mountains");
DialogResult result = saveFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
// TODO: Finish
}
... но не открывается C:\Program Files\Waltons\Mountains
ОБНОВЛЕНИЕ 2
Предложение Saeb, кажется, работает, так как диалоговое окно сохранения файла открывается в C:\Waltons \ Mountains \ bin \ Debug
... который, я надеюсь / думаю, будет соответствовать C:\Waltons на компьютере пользователя (или D:\Waltons или Z:\Waltons или как угодно).
Я должен был бы добавить "\Maps", я думаю, для пользователя - проверить, что он не работает в Visual Studio или что-то еще, и добавить это в этом случае.
3 ответа
Расположение, доступное для записи обычному пользователю, будет лучшим местом по умолчанию для диалога сохранения. Т.е. "мои документы" через Environment.GetFolderPath
Передача одного из значений Environment.SpecialFolder:
var pathToMyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.Personal));
Если вам нужно место, где ваша программа установлена по умолчанию, как программные файлы
Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "MyFolder");
или если вам нужен путь относительно проверки программы Как я могу получить путь к приложению в консольном приложении.NET?,
Обратите внимание, что указанные выше места недоступны для записи обычным пользователям и даже администраторам, если вы не отключите UAC, не откроете явно "запускать от имени администратора" или не измените разрешения по умолчанию для этих папок (любой из способов обойти разрешение по умолчанию имеет свои недостатки, и следует выполнить серьезную проверку безопасности. если разрешить постоянным пользователям писать в programs
/system
папки).
Не используйте жестко прописанные буквы драйвера. Найти путь во время выполнения. например:
saveFileDialog1.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
Вы можете использовать переменную окружения systemroot, чтобы получить диск. Попробуйте открыть командную строку и ввести set, чтобы увидеть список всех доступных переменных среды, а затем использовать System.Envrionment.GetEnvironmentVariable ("systemdrive") и объединить это с остальной частью вашего пути.