假设 UAC 已开启。关闭它不会产生问题。

我有一个带有备份/恢复功能并使用 SQL Server 2005 Express 的 C# 应用程序。

获取 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;

备份时,数据库会在 **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

有帮助吗?

解决方案

请参阅相关的堆栈溢出 问题, ,特别是从 关联 由此 回答:

folderid_programdata / system.environment.specialfolder.commonapplicationdata

用户永远不想在Explorer中浏览此处,此处更改的设置应影响机器上的每个用户。默认位置是在Windows Vista的安装上,是一个隐藏文件夹的SystemDrive% ProgramData。 您需要创建目录并在安装时设置所需的ACL。

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

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

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

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

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

其他提示

我觉得你打Vista的虚拟化功能 - 这是为了保持从没有工作在Vista上,他们不允许写旧顽劣应用%ProgramData%

您的应用程序可以从%ProgramData%读不能写它。如果你真的想在%ProgramData%写你必须运行升高(或更改DACL的子路径,让你写的)。

请参阅 http://technet.microsoft.com/en-us/杂志/ cc160980.aspx (数据重定向)的更多细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top