Pregunta

Supongamos que UAC está activado.Esto no crea ningún problema si está apagado.

Tengo una aplicación C# con funcionalidad de copia de seguridad/restauración y uso SQL Server 2005 Express.

El código para obtener BackupPath se utiliza tanto para la copia de seguridad como para la restauración y el nombre para todos los fines será backup.dat.

para generar ruta de respaldo

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;

En la copia de seguridad, la base de datos genera backup.dat en **C:\ProgramData\CompName\AppName** y no tiene dificultades para comprimir desde esa ubicación a un directorio de destino elegido por el usuario.

Al restaurar, no tiene problemas para obtener el directorio archivado o el archivo, pero cuando se descomprime va a **C:\Users\UserName\AppData\Local\VirtualStore\ProgramData\CompName\AppName**

Necesito saber por qué mi archivo descomprimido va a una tienda virtual para poder restaurar la base de datos porque, por lo que entiendo de programación para Vista SQL Server, no debería/no podré acceder a esa ruta de la tienda virtual.

editar:No se pudo proporcionar descompresión. No creo que este sea el problema, pero aquí está.

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();
}

Gracias por toda la ayuda -TK

¿Fue útil?

Solución

Vea este desbordamiento de pila relacionado pregunta, en particular de la enlace de esto respuesta:

FOLDERID_ProgramData / System.Environment.SpecialFolder.CommonApplicationData

El usuario nunca querría navegar aquí en el Explorador, y la configuración cambió aquí debería afectar a todos los usuarios de la máquina.La ubicación predeterminada es %systemdrive%\ProgramData, que es un hidden carpeta, en una instalación de Windows Vista. Querrás crear su directorio y establezca las ACL que desea necesidad en el momento de la instalación.

Entonces, si desea que sus usuarios puedan escribir en esta carpeta, deberá otorgarles el acceso adecuado cuando se ejecute el instalador.

Si tienen acceso de escritura a la carpeta, no creo que tengas problemas con la virutalización.Sin embargo, realmente deberías marcar tu aplicación con el nivel de privilegio que requiere agregando algo como esto a tu manifiesto (detalles):

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

Esto deshabilitará la virtualización de su proceso.Puede ver si su proceso se está virtualizando agregando la columna "Virtualización" al Administrador de tareas en Ver - Seleccionar columnas...

Por cierto, Directory.CreateDirectory() creará directorios principales automáticamente.

Otros consejos

Creo que está golpeando la característica Vista de virtualización -. Que está destinado a mantener viejas aplicaciones se comporten mal de no trabajar en Vista en los que no se les permite escribir en% ProgramData%

Su aplicación puede leer desde% ProgramData% pero no escribir en él. Si realmente desea escribir en% ProgramData% tiene que ejecutar elevado (o cambiar la DACL del subtrazado a dejar de escribir).

http://technet.microsoft.com/en-us/ revista / cc160980.aspx (redirección de datos) para más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top