2011-02-23 7 views
7

En mi aplicación, almaceno en cada máquina algunos archivos en una carpeta de aplicaciones.Uso de SHGetSpecialFolderPath para recuperar una carpeta de aplicación a la que se puede acceder también a usuarios que no son administradores, ¿qué CSIDL elegir?

Una versión simplificada del caso real es la siguiente:

..\Project1\LoginHistory (login history file - common for all users) 
..\Project1\Translations (localization files - common for all users) 
..\Project1\FormSettings\User1\ (this contains an ini file per form for User1) 
..\Project1\FormSettings\UserN\ (this contains an ini file per form for UserN) 

Así se puede ver por la que utilizo esto: para guardar algunos datos que es específico de la máquina (recuerda los últimos datos de acceso hechos de esta máquina, una especie de MRU), para almacenar cadenas de traducción o componentes de terceros (estos son tiempos de ejecución extraídos de recursos exe) y para guardar algunos datos específicos del usuario (como el tamaño del formulario). El caso real es más complejo, pero al menos se puede entender que hay alguna "carpeta común" y algunas "carpetas de usuario".

Ahora me gustaría mantener esta estructura, por lo que todos mis archivos en una sola carpeta .. \ Project1 (+ subcarpetas). Incluso porque los usuarios no son los usuarios de Windows, pero son usuarios de SQL Server.

Mi pregunta es qué carpeta elegir para ..\.

Actualmente estoy (con éxito) que utiliza este código para retrieveing ​​..\

uses ShlObj; 

function GetSpecialFolder(const CSIDL: integer) : string; 
var 
    RecPath : PWideChar; 
begin 
    RecPath := StrAlloc(MAX_PATH); 
    try 
    FillChar(RecPath^, MAX_PATH, 0); 
    if SHGetSpecialFolderPath(0, RecPath, CSIDL, false) 
     then result := RecPath 
     else result := ''; 
    finally 
     StrDispose(RecPath); 
    end; 
end; 

Y me llaman con

GetSpecialFolder(CSIDL_APPDATA) 

donde se define la lista de CDISL here.

GetSpecialFolder(CSIDL_APPDATA) vuelve C:\Users\username\AppData\Roaming en Windows 7.

Así que este utiliza para trabajar, pero recientemente he recibido alguna queja de algún cliente que parece estar directamente relacionada con problemas de lectura/escritura en estas carpetas. (por ejemplo C:\Users\username\AppData\Roaming\Project1\LoginHistory - utilizando las carpetas enumeradas anteriormente).

Entonces mi pregunta es: ¿es correcto usar CSIDL_APPDATA? ¿Tienes otra sugerencia? ¿Existe la posibilidad de que en algunos sistemas operativos o con algunos usuarios con privilegios realmente reducidos, pueda haber problemas de lectura/escritura en esa carpeta?

Recuerde que no me gustaría tener más de una carpeta raíz para mis archivos.

+1

Los usuarios tienen que poder escribir allí. De lo contrario, todo el sistema se descompone. ¿Quizás necesite crear directorios faltantes antes de escribir archivos? ¡Es difícil depurar esto si no nos dices el código de error y el mensaje! –

+0

Sí, si el usuario no puede escribir, por supuesto, la idea no está funcionando. No puedo reproducir el problema. Me acaban de informar que alguien tiene este problema, así que estoy tratando de adivinar cuál es el motivo. Probabyl tendré la oportunidad de investigarlo más a fondo, pero no ahora. Es por eso que pregunté. – LaBracca

Respuesta

0

El enfoque que uso finalmente es el correcto. Ya que realmente no necesito archivos comunes para mi aplicación (tiene sentido que todos los archivos temporales sean específicos del usuario, porque las pocas cosas comunes están almacenadas en la base de datos) CSIDL_APPDATA es un buen lugar.

El problema al que me enfrentaba todavía no está claro pero sospecho que es debido al hecho de que login.ini es una palabra reservada (solo recientemente, después de algunas actualizaciones recientes de Windows).

Ya he preguntado this question.

5

Creo que desea utilizar CSIDL_COMMON_APPDATA para archivos que no son específicos del usuario. Si asumió (en su código) que los archivos almacenados en CSIDL_APPDATA se comparten entre los usuarios, eso no está permitido.

+0

Pero quiere decir que un usuario con "sin privilegios en la máquina", digamos que un tipo de usuario "invitado" puede leer la escritura de 'CSIDL_COMMON_APPDATA' y no de' CSIDL_APPDATA'? Quiero decir, cambiando a 'CSIDL_COMMON_APPDATA' ¿hay posibilidades de que las cosas vayan mejor o no? ¿O está sugiriendo esto solo porque "semánticamente" sería una mejor opción (y estoy de acuerdo con usted)? – LaBracca

+0

Solo para confirmar: 'CSIDL_COMMON_APPDATA' es 100% mejor, aquí (http://msdn.microsoft.com/en-us/library/bb762494(v=vs.85).aspx) también dicen que" Esta información no deambula y está disponible para cualquiera que use la computadora ". Si bien esto no está escrito para 'CSIDL_APPDATA'. – LaBracca

+0

Tengo un comentario más: ¿y qué sucede en un escenario de servidor de terminal? En ese caso, más usuarios utilizarán la misma carpeta y esto podría ser un problema. – LaBracca

Cuestiones relacionadas