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.
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! –
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