C# - Vista - 使用CommonApplicationData时,解压缩被虚拟化

时间:2009-02-24 14:35:12

标签: c# windows-vista compression virtualstore

假设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;

在备份时,db会在** C:\ ProgramData \ CompName \ AppName **中生成backup.dat,并且从该位置压缩到用户选择的目标目录没有任何困难。

在恢复时,获取存档目录或文件没有问题,但解压缩后会转到** C:\ Users \ UserName \ AppData \ Local \ VirtualStore \ ProgramData \ CompName \ AppName **

我需要知道为什么我的解压缩文件要进入虚拟存储,所以我可以恢复数据库,因为根据我对vista sql server的编程理解,不应该/不能访问该虚拟存储路径。 / p>

编辑:未能提供解压缩 - 我不认为这是问题,但现在是。

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 个答案:

答案 0 :(得分:1)

我认为你正在使用Vista虚拟化功能 - 这是为了让旧的不良行为的应用程序不能在Vista上工作,不允许他们写入%ProgramData%。

您的应用可以从%ProgramData%读取但不能写入。如果你真的想在%ProgramData%下编写,你必须运行提升(或更改子路径上的DACL以便你写)。

有关详细信息,请参阅http://technet.microsoft.com/en-us/magazine/cc160980.aspx(数据重定向)。

答案 1 :(得分:1)

请参阅此相关Stack Overflow question,特别是来自此linkanswer

  

FOLDERID_ProgramData /   System.Environment.SpecialFolder.CommonApplicationData

     

用户永远不想浏览   在资源管理器中,设置已更改   这里应该影响到每个用户   机。默认位置是   %systemdrive%\ ProgramData,这是一个   隐藏文件夹,在安装上   Windows Vista。 你想要创造   你的目录并设置你的ACL   需要在安装时。

因此,如果您希望用户能够写入此文件夹,则必须在安装程序运行时为其提供适当的访问权限。

如果他们对该文件夹具有写入权限,那么我认为您不会遇到虚拟化问题。但是,您应该通过向清单(details)添加类似内容来标记应用程序所需的权限级别:

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

这将禁用您的进程的虚拟化。您可以通过在“查看 - 选择列”下的“任务管理器”中添加“虚拟化”列来查看您的流程是否正在虚拟化...

顺便说一句,Directory.CreateDirectory()将自动创建父目录。