Отказано в доступе по пути, как решить? (Программа запущена от имени администратора, манифест тоже настроен)
Пишу небольшую программу, которая по нажатию кнопки скачивает файл с GoogleDrive. Сам API я для этого поставил, пишу следующий код и получаю ошибку по причине "Отказано в доступе по пути", хотя запускаю Visual Studio от имени администратора, манифест настроил, точнее поменял там одну строку, как написано в интернете. Уже дал полный доступ своему пользователю ко всему диску C и в свойствах диска убрал атрибут только для чтения, но ничего не помогает, что еще надо?
private void UpdateButton_Click(object sender, EventArgs e)
{
DriveService service = new DriveService();
var stream = service.HttpClient.GetStreamAsync("https://drive.google.com/file/d/1Dt-
SXQmwcHlZMEuV7rfz-0SHwTLKIiCR/view?usp=sharing");
var result = stream.Result;
using (var fileStream = System.IO.File.Create(@"C:\Users\" + Environment.UserName.ToString() + @"\AppData\Roaming"))
{
result.CopyTo(fileStream);
}
}
Ответы (2 шт):
File.Create создает файл по заданному пути. Вы передаете в метод путь к папке. Метод пытается создать файл с именем «Roaming» в папке «AppData». Возникает ошибка, т.к. нельзя создавать файл с таким же именем как уже существующая папка в том же расположении.
Почему то при этом выбрасывается UnauthorizedAccessException хотя в документации такой случай не описывается.
Чтобы исправить нужно добавить имя файла:
using (var fileStream = System.IO.File.Create(@"...\Roaming\icon.png"))
забыл уточнить, что я скачиваю не файл, а целую папку с кучей фалов
В коде это не написано. Если так, то нужно разбирать файлы и для каждого создавать файл с соответствующим названием.
Проиллюстрирую всё, о чем пишут в соседнем ответе и комментах, плюс исправил ошибку асинхронности
private async void UpdateButton_Click(object sender, EventArgs e)
{
DriveService service = new DriveService();
using var stream = await service.HttpClient.GetStreamAsync("https://drive.google.com/file/d/1Dt-SXQmwcHlZMEuV7rfz-0SHwTLKIiCR/view?usp=sharing");
string myFolder = @"Downloads\";
string filename = "file.txt";
using var fileStream = File.Create(Path.Combine(Environment.SpecialFolder.ApplicationData, myFolder, filename));
stream.CopyTo(fileStream);
}