1

假设 UAC 为 ON。这不会产生关闭它的问题。

我有具有备份/恢复功能并使用 sql server 2005 express 的 ac# 应用程序。

获取 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 编程的理解,不应该/将无法访问该虚拟存储路径。

编辑:未能提供减压 - 我认为这不是问题,但问题就在这里。

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

4

2 回答 2

2

我认为您正在使用 Vista 虚拟化功能 - 它旨在防止旧的行为不良的应用程序无法在不允许写入 %ProgramData% 的 Vista 上运行。

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

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

于 2009-02-24T15:54:45.563 回答
1

请参阅此相关的 Stack Overflow问题,特别是来自此答案的链接

FOLDERID_ProgramData / System.Environment.SpecialFolder.CommonApplicationData

用户永远不想在资源管理器中浏览此处,并且此处更改的设置会影响计算机上的每个用户。默认位置是 %systemdrive%\ProgramData,它是 Windows Vista 安装上的隐藏文件夹。您需要在安装时创建目录并设置所需的 ACL。

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

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

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

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

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

于 2009-02-27T02:58:44.470 回答