Как запросить разрешение на чтение/запись в папку %AppData%?C#

Место общения программистов C#
Ответить
Anonymous
 Как запросить разрешение на чтение/запись в папку %AppData%?

Сообщение Anonymous »

Я пытаюсь прочитать список элементов (и, возможно, записать в них) из папок LocalLow, где Steam сохраняет данные некоторых игр, в основном из любопытства, но мне не удалось найти способ даже запросить доступ без блокировки «System.UnauthorizedAccessException: Access to the path 'C:\Users\...»: я обновил свой манифест, включив в него (и пробовал с uiAccess="true"), но безрезультатно; вот мой код

Код: Выделить всё

using System.Diagnostics; //VS22 automatically added this reference during one of my attempts to make this work but I can't remember which it was used for, might not be necessary

class Program
{
static string gameAddress = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + @"\AppData\LocalLow\Owlcat Games"; //... more specific environment locations, just an example

static string Locale = "";

static string Storage = @"C:\Program Files\FileManager";

void Main()
{

if (File.Exists(Storage))
{
Console.WriteLine("True");
} else
{
Console.WriteLine("False");
try
{
Directory.CreateDirectory(Storage);
} catch (Exception ex) { Console.WriteLine(ex); }
}

Console.WriteLine("check 1")

FileFetch();

Console.WriteLine("check 2")

}

public static async void FileFetch() //async for the future; checking available files during startup
{

int errorPos = 0;

try
{
string[] files = Directory.GetDirectories(gameAddress, "", SearchOption.AllDirectories);

foreach (string file in files)
{
Console.WriteLine(file);
Locale = file; //just grabbing something to see if I can edit it
}

errorPos++;
}
catch (Exception ex)
{
Console.WriteLine("1: " + ex);
}

try
{
string tmpFile = @"C:\tmp\testFile";

if (!File.Exists(tmpFile))
{
File.Create(tmpFile);
}

errorPos++;
string source = @"C:\Users\peppe\AppData\LocalLow\Owlcat Games\Warhammer 40000 Rogue Trader\Saved Games\Auto_1.zks";
// try to copy a file from here?
File.Copy(source, tmpFile, true);
Console.WriteLine("Check 3");
File.Copy(tmpFile, @"C:\Users\peppe\AppData\LocalLow\Owlcat Games\Warhammer 40000 Rogue Trader\Saved Games\Auto_2.zks", true); // res should be 2435kb instead of 2185kb
Console.WriteLine("Success!");
Process.Start("explorer.exe", @"C:\Users\peppe\AppData\LocalLow\Owlcat Games\Warhammer 40000 Rogue Trader\Saved Games");

//This worked, so now im really confused

} catch (Exception ex)
{
Console.WriteLine(errorPos + " " + ex);
}
}
}
Проблема, с которой я столкнулся, заключается в том, что я просто получаю разрешения на работу — доступ к локальным данным приложения программы никогда не вызывает подобных проблем, но попытка получить информацию о другой папке — это то, о чем я не могу найти никакой информации.
Изменить: Как отметил Фрокс, ошибка может быть вызвана тем, что Filestream пытается прочитать папку вместо реального файла; Я переключил свой код на использование Directory.GetDirectories(); чтобы достичь того, что я изначально пытался протестировать с помощью StreamReader, но мне все еще выдается исключение UnauthorizedAccessException при попытке манипулировать или даже создавать определенные файлы, поэтому разрешение разрешений все равно будет оценено. Протестировал Directory.CreateDirectory() на несколько уровней на моем рабочем столе, проблем не возникло, но создание внутри определенных папок, созданных Steam, и даже C:\Program Files\ вызывает ошибку.
Редактировать 2: Написал кое-что, чтобы вручную проверить, могу ли я копировать в определенные глубокие файлы и из них, и это работало отлично, но я все еще получаю ошибку при попытке создать папку в C:\Program Files, метод CreateDirectory работал как задумано при записи в рабочий стол.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ata-folder
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»