WPF C# StreamWriter не записывает в файл и не вызывает исключений - PullRequest
1 голос
/ 06 апреля 2020

Я использую этот фрагмент кода для записи (добавления) текста в файл журнала в моем приложении WPF. Путь к файлу по умолчанию находится внутри Program Files. Если я запускаю приложение как обычный пользователь, файл не записывается (или не создается), но исключение разрешений не возникает, несмотря на оператор try-catch. Если пользователь указывает несистемную папку для файлов журнала (что можно сделать во время выполнения), все работает. Если приложение запускается от имени администратора, все работает даже с папкой по умолчанию (системная). Это явно проблема с разрешениями. Я не понимаю, почему этот код не вызывает исключения, если пользователь не является администратором и пытается создавать / записывать файлы в системной папке. В таком случае File.AppendText должно повысить UnauthorizedAccessException, не так ли? В чем здесь проблема?

try
{
    using (StreamWriter w = File.AppendText(path))
    {
        w.WriteLine(line.ToString());
    }
}
catch (Exception ex)
{
    var message = $"{path}\n{ex.Message}";
    MessageBox.Show(message, "Log File Error", MessageBoxButton.OK, MessageBoxImage.Error);
}

ОС: Windows 10

Net Версия фреймворка 4

1 Ответ

4 голосов
/ 06 апреля 2020

Я использую этот фрагмент кода для записи (добавления) текста в файл журнала в моем приложении WPF. Путь к файлу по умолчанию находится внутри Program Files. Если я запускаю приложение как обычный пользователь, файл не записывается (или не создается), но исключение разрешений не возникает, несмотря на оператор try-catch.

Вы нажимаете UA C виртуализация .

Как Раймонд Чен выражает это :

UA C Виртуализация вступает в силу для приложений, которые были разработаны для версий Windows до Windows Vista. Эти приложения часто предполагают, что они работают с правами администратора, и когда они пытаются записать в файл или в регистр, которые обычно ограничены администраторами, они ожидают, что они преуспеют. Таким образом, UA C Virtualization позволяет успешно выполнять эти записи, тайно перенаправляя их в другое место в профиле пользователя. Обратное происходит, когда приложение позже пытается прочитать файл или раздел реестра: если файл или ключ существует в перенаправленном местоположении, он используется вместо того, который находится в административном расположении.

Вы можете прочитать вышеупомянутый Te chNet статья для деталей . Короткая версия заключается в том, что вы можете найти файлы в каталоге %LOCAL­APP­DATA%\Virtual­Store и ключи под ключом HKEY_CURRENT_USER\Software\Classes\Virtual­Store.

Не пытайтесь писать в Program Files. Напишите куда-нибудь подходящее в AppData, либо ApplicationData или CommonApplicationData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...