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

C# C-Vista-使用CommonApplicationData时虚拟化解压缩,c#,windows-vista,compression,virtualstore,C#,Windows Vista,Compression,Virtualstore,假设UAC是开着的。这不会在关闭时产生问题 我有一个具有备份/恢复功能并使用SQLServer2005Express的c应用程序 获取备份路径的代码用于备份和还原,所有用途的名称均为backup.dat 生成备份路径的步骤 string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); path = Path.Combine(path, "CompName"); if(!Dir

假设UAC是开着的。这不会在关闭时产生问题

我有一个具有备份/恢复功能并使用SQLServer2005Express的c应用程序

获取备份路径的代码用于备份和还原,所有用途的名称均为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编程的理解,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

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

您的应用程序可以读取%ProgramData%,但不能写入。如果确实要在%ProgramData%下写入,则必须运行提升或更改子路径上的DACL以允许写入


有关更多详细信息,请参阅数据重定向。

请参阅此相关堆栈溢出,特别是从以下位置:

FOLDERID_程序数据/ System.Environment.SpecialFolder.CommonApplicationData

用户永远不会想要浏览 在资源管理器中,设置已更改 这里应该会影响网络上的每个用户 机器默认位置为 %systemdrive%\ProgramData,它是一个 隐藏文件夹,安装在 WindowsVista。您将要创建 您的目录并设置所需的ACL 需要在安装时安装

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

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

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


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

谢谢你的文章,但我不是在写程序文件。枚举环境.SpecialFolder.CommonApplicationData不以程序文件空间为目标。据我所知,CommonApplicationData应该是特定应用程序的所有用户的公共目录。与AppData类似。
<security>
  <requestedPrivileges>
    <requestedExecutionLevel level="asInvoker" />
  </requestedPrivileges>
</security>