C # - Vista - декомпрессия виртуализируется при использовании CommonApplicationData - PullRequest
1 голос
/ 24 февраля 2009

Предположим, что UAC включен. Это не создает проблемы с этим выключенным.

У меня есть приложение на c # с функцией резервного копирования и восстановления, использующее SQL Server 2005 Express.

код для получения backupPath используется как для резервного копирования, так и для восстановления, а именем для всех целей будет 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;

При резервном копировании БД создает файл backup.dat в папке ** C: \ ProgramData \ CompName \ AppName **, и при этом не возникает проблем с переносом из этого расположения в целевой каталог по выбору пользователей.

При восстановлении не возникает проблем с получением заархивированного каталога или файла, но при распаковке он переходит в папку ** C: \ Users \ Имя пользователя \ AppData \ Local \ VirtualStore \ ProgramData \ CompName \ AppName **

Мне нужно знать, почему мой распакованный файл отправляется в виртуальное хранилище, чтобы я мог восстановить базу данных, потому что, насколько я понимаю, программирование для Vista SQL Server не должно / не сможет получить доступ к этому пути виртуального хранилища.

edit: не удалось выполнить декомпрессию - я не думаю, что это проблема, но вот она.

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

Ответы [ 2 ]

1 голос
/ 27 февраля 2009

См. Это связанное переполнение стека вопрос , в частности, по ссылке из этого ответа :

FOLDERID_ProgramData / System.Environment.SpecialFolder.CommonApplicationData

Пользователь никогда не захочет просматривать здесь в проводнике, и настройки изменились здесь должно влиять каждый пользователь на машина. Расположение по умолчанию % systemdrive% \ ProgramData, который является скрытая папка, при установке Виндоус виста. Вы захотите создать ваш каталог и установить ACL, которые вы нужно во время установки.

Так что, если вы хотите, чтобы ваши пользователи могли писать в эту папку, вы должны предоставить им соответствующий доступ при запуске установщика.

Если у них есть доступ для записи в папку, тогда я не думаю, что у вас возникнут проблемы с вирулизацией. Однако вы действительно должны пометить ваше приложение требуемым уровнем привилегий, добавив что-то вроде этого в манифест ( details ):

<security>
  <requestedPrivileges>
    <requestedExecutionLevel level="asInvoker" />
  </requestedPrivileges>
</security>

Это отключит виртуализацию для вашего процесса. Чтобы узнать, виртуализируется ли ваш процесс, добавьте столбец «Виртуализация» в диспетчер задач в разделе «Просмотр» - «Выбрать столбцы» ...

Кстати, Directory.CreateDirectory () автоматически создаст родительские каталоги.

1 голос
/ 24 февраля 2009

Я думаю, что вы используете функцию виртуализации Vista - она ​​предназначена для того, чтобы старые приложения с плохим поведением не работали в Vista, где им не разрешено писать в% ProgramData%.

Ваше приложение может читать из% ProgramData%, но не записывать в него. Если вы действительно хотите писать в% ProgramData%, вам нужно запустить с повышенными правами (или изменить DACL для подпути, чтобы вы могли писать).

Подробнее см. http://technet.microsoft.com/en-us/magazine/cc160980.aspx (Перенаправление данных).

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