C # - Vista - Декомпрессия виртуализируется при использовании CommonApplicationData
-
06-09-2019 - |
Вопрос
Предположим, что UAC включен.Это не создает проблем с его выключением.
У меня есть приложение на c # с функцией резервного копирования / восстановления и использованием sql server 2005 express.
код для получения обратного пути используется как для резервного копирования, так и для восстановления, и имя для всех целей будет backup.dat
для создания пути резервного копирования
string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
path = Path.Combine(path, "CompName");
if(!Directory.Exists(path))
Directory.CreateDirectory(path);
path = Path.Combine(path, "AppName");
if(!Directory.Exists(path))
Directory.CreateDirectory(path);
return path;
При резервном копировании база данных создает резервную копию.dat в **C:\ProgramData\CompName\AppName ** и у нее не возникает трудностей с архивированием из этого местоположения в целевой каталог по выбору пользователя.
При восстановлении у него не возникает проблем с получением архивированного каталога или файла, но при распаковке он переходит в **C:\Users\UserName\AppData\Local\VirtualStore\ProgramData\CompName\AppName**
Мне нужно знать, почему мой распакованный файл отправляется в виртуальное хранилище, чтобы я мог восстановить базу данных, потому что из того, что я понимаю в программировании для Vista, sql server не должен / не сможет получить доступ к этому пути виртуального хранилища.
Редактировать:не удалось обеспечить декомпрессию - я не думаю, что это проблема, но вот она.
private void DecompressArchiveFile(string compressedFile, string backupPath)
{
GZipStream gzip = new GZipStream(new FileStream(compressedFile, FileMode.Open, FileAccess.Read, FileShare.None), CompressionMode.Decompress, false);
FileStream fs = new FileStream(backupPath, FileMode.Create, FileAccess.Write, FileShare.None);
byte[] buffer = new byte[10000];
int count = -1;
while (count != 0)
{
count = gzip.Read(buffer, 0, 10000);
fs.Write(buffer, 0, count);
}
gzip.Close();
fs.Close();
}
Спасибо за любую помощь -TK
Решение
Смотрите это связанное с переполнением стека вопрос, в частности , из Ссылка из этого ответ:
Идентификатор папки_программные данные / Система.Среда.Специальная папка.Общие данные приложения
Пользователь никогда не захочет просматривать здесь, в Проводнике, и настройки изменены это должно повлиять на каждого пользователя на компьютере .Расположение по умолчанию - %systemdrive%\ProgramData, которое является скрытой папкой при установке Windows Vista. Вы захотите создать свой каталог и установить списки управления доступом, которые вам понадобятся во время установки.
Поэтому, если вы хотите, чтобы ваши пользователи могли выполнять запись в эту папку, вам придется предоставить им соответствующий доступ при запуске программы установки.
Если у них есть доступ на запись к папке, то я не думаю, что у вас возникнут проблемы с вирутализацией.Однако вам действительно следует пометить свое приложение требуемым уровнем привилегий, добавив что-то вроде этого в свой манифест (Подробные сведения):
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" />
</requestedPrivileges>
</security>
Это отключит виртуализацию для вашего процесса.Вы можете узнать, виртуализируется ли ваш процесс, добавив столбец "Виртуализация" в диспетчер задач в разделе Просмотр - Выбор столбцов...
Кстати, Directory.CreateDirectory() автоматически создаст родительские каталоги.
Другие советы
Я думаю, вы используете функцию виртуализации Vista - она предназначена для того, чтобы старые приложения с плохим поведением не работали в Vista, где им не разрешено записывать данные в %ProgramData%.
Ваше приложение может считывать данные из %ProgramData%, но не записывать в него.Если вы действительно хотите писать под %ProgramData%, вам нужно запустить с повышенными правами (или изменить DACL в подпути, чтобы разрешить запись).
Видишь http://technet.microsoft.com/en-us/magazine/cc160980.aspx (Перенаправление данных) для получения более подробной информации.