假设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
答案 0 :(得分:1)
我认为你正在使用Vista虚拟化功能 - 这是为了让旧的不良行为的应用程序不能在Vista上工作,不允许他们写入%ProgramData%。
您的应用可以从%ProgramData%读取但不能写入。如果你真的想在%ProgramData%下编写,你必须运行提升(或更改子路径上的DACL以便你写)。
有关详细信息,请参阅http://technet.microsoft.com/en-us/magazine/cc160980.aspx(数据重定向)。
答案 1 :(得分:1)
请参阅此相关Stack Overflow question,特别是来自此link的answer:
FOLDERID_ProgramData / System.Environment.SpecialFolder.CommonApplicationData 强>
用户永远不想浏览 在资源管理器中,设置已更改 这里应该影响到每个用户 机。默认位置是 %systemdrive%\ ProgramData,这是一个 隐藏文件夹,在安装上 Windows Vista。 你想要创造 你的目录并设置你的ACL 需要在安装时。
因此,如果您希望用户能够写入此文件夹,则必须在安装程序运行时为其提供适当的访问权限。
如果他们对该文件夹具有写入权限,那么我认为您不会遇到虚拟化问题。但是,您应该通过向清单(details)添加类似内容来标记应用程序所需的权限级别:
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" />
</requestedPrivileges>
</security>
这将禁用您的进程的虚拟化。您可以通过在“查看 - 选择列”下的“任务管理器”中添加“虚拟化”列来查看您的流程是否正在虚拟化...
顺便说一句,Directory.CreateDirectory()将自动创建父目录。