2010-03-08 11 views
7

Estamos creando un juego que pronto agregará una función de editor de niveles. Queremos que el usuario pueda poner los niveles que ha descargado en una carpeta y luego jugar en el juego, sin problemas. Por lo tanto, estamos buscando una carpeta que cualquiera pueda encontrar, abrir, escribir, leer y multiusuario. En Windows Vista/7, la carpeta/Users/Public/parece un gran candidato. Sin embargo, no figura en .net enum System.Environment.SpecialFolder. Los revisé todos, y verifiqué qué ofrecen en las diferentes versiones de Windows, y ninguno cumple mis requisitos.Encontrar la mejor carpeta para todos los usuarios en una máquina con Windows

Encontré Environment.SpecialFolder.CommonApplicationData, eso funciona, pero esa carpeta está oculta (C: \ ProgramData) y supongo que la mayoría de los usuarios no muestran las carpetas ocultas.

Tal como está ahora, parece que tendremos que conformarnos con la carpeta de documentos personales, pero realmente nos gustaría una carpeta de usuarios múltiples.

¿Alguien tiene algún consejo?

(duro C de codificación: \ Users \ Public \ está fuera de la cuestión, que sólo funcionará en sistemas en inglés)

Respuesta

8

Doug Henning en finding the path for C:\Users\Public:

No hay un valor CSIDL para esta carpeta, pero el entorno de puntos variable pública a la misma, por lo que puede utilizar GETENV ('público') para determinar su ubicación. De forma predeterminada, esta variable contiene C: \ Users \ Public en Windows Vista. La variable no existe en Windows XP, por lo que su código debe manejar el caso donde GETENV ('PUBLIC') devuelve un valor en blanco.

Como alternativa, podría usar el elemento principal de la carpeta especificada por CSIDL_COMMON_DOCUMENTS, que proporciona C: \ Documents and Settings \ All Users \ Documents en XP y C: \ Users \ Public \ Documents en Vista.

Creo que Environment.SpecialFolder.CommonDocuments puede ser el lugar adecuado para sus archivos.

+0

CommonDocuments de la aplicación de sonidos impresionante, sin embargo, es .NET 4.0, y estoy usando mono 1.2.5 (que es como .NET 2.0), por lo que Tendré que hacer algo como lo anterior. Gracias. – reallyjoel

+0

CSIDL_COMMON_DOCUMENTS es el valor de CSIDL apropiado. –

1

Podría poner una carpeta en el directorio de la aplicación, a continuación, crear un acceso directo a la misma para cada usuario (cuando usan por primera vez la función) en su directorio de inicio? Sé que no es exactamente la carpeta preexistente "Universal" que podría haber deseado, pero ¿funcionaría de todos modos?

+1

Usted tendría que ser un administrador para trabajar con directorios –

4

Lo siguiente debe volver C:\Users\Public\Documents\ en Vista/Win7 y C:\Documents and Settings\All Users\Documents para sistemas operativos anteriores.

[System.Runtime.InteropServices.DllImport("shell32.dll")] 
static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, 
uint dwFlags, [Out] StringBuilder pszPath); 

public string GetSharedDocsFolder() { 
StringBuilder sb = new StringBuilder(); 
int CommonDocumentsFolder = 0x002e; 

SHGetFolderPath(IntPtr.Zero, CommonDocumentsFolder, IntPtr.Zero, 0x0000, sb); 
return sb.ToString(); 
} 
+0

Eso parece demasiado aterrador. – reallyjoel

+1

Tenga en cuenta que, de forma predeterminada, todos los usuarios pueden escribir en esta ubicación, pero los usuarios no pueden escribir en archivos o carpetas creados por otro usuario. Si desea que varios usuarios que no son administradores puedan modificar el mismo archivo, debe administrar los permisos explícitamente, independientemente de dónde cree el archivo/carpeta en el sistema de archivo. –

Cuestiones relacionadas