C # - Vista - Декомпрессия виртуализируется при использовании CommonApplicationData

StackOverflow https://stackoverflow.com/questions/581955

Вопрос

Предположим, что 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 (Перенаправление данных) для получения более подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top