Actualmente, yo uso Path.GetTempPath() de averiguar donde escribir mis archivos de registro, pero recientemente me encontré con un usuario de la máquina donde la ruta devuelta no fue lo que esperaba.

Generalmente, la devuelve el path es C:\Documents and Settings\[id de usuario]\Configuración Local\Temp
pero en este caso, fue C:\Temp

Esto normalmente no sería un problema, pero por alguna razón el usuario en cuestión no tiene acceso de escritura a C:\Temp

He vuelto a revisar las variables de entorno, y la variable de entorno de USUARIO se apunta como se esperaba a C:\Documents and Settings\[id de usuario]\Configuración Local\Temp, mientras que la variable de entorno del SISTEMA se apunta a C:\WINNT\Temp.

Así que… ¿dónde está Path.GetTempPath() llegar es el valor de ? La Directiva De Grupo? Registro?

Que he buscado en Google, pero fue en vano.

  • +1 Rápida, limpia, clara, buena pregunta – Bienvenido a StackOverflow
  • si usted necesita un lugar seguro que es siempre de escritura para el usuario, retirar el almacenamiento aislado: msdn.microsoft.com/en-us/library/bdts8hk0.aspx
  • a menos FIPS está habilitado, en el que caso de que usted obtenga una excepción al intentar utilizar IsolatedStorage
  • muy interesante, gracias por ese puntero. Primera vez que oigo algo así (probablemente a partir de aquí, en Europa, que en realidad no importa mucho «FIPS» y tal….)

6 Comentarios

  1. 53

    (Mediante Reflector) Path.GetTempPath() finalmente se llama a la función de Win32 GetTempPath (de kernel32.dll). La MSDN docs para este estado:

    GetTempPath función comprueba la existencia de variables de entorno en el siguiente orden y utiliza el primer camino que se encuentra:

    • La ruta de acceso especificada por la variable de entorno TMP.
    • La ruta de acceso especificada por la variable de entorno TEMP.
    • La ruta de acceso especificada por la variable de entorno USERPROFILE.
    • El directorio de Windows.

    Tenga en cuenta que también afirman que no comprobar si es o no el camino que realmente existe o puede ser escrito a, así que usted puede terminar para arriba tratando de escribir los archivos de registro en un camino que no existe, o uno que usted no puede tener acceso.

    • Gran respuesta! Claro, conciso y exactamente la información que necesitaba. No había pensado en la comprobación de la función de Win32 docs… Muchas gracias. Andy
    • Más reciente de la documentación de Path.GetTempPath() muy parecida en su contenido en el campo de Comentarios.
    • Este no es el caso, sólo me he hecho eco de mis variables ambientales, Comprobado en las propiedades del sistema y hacer un Camino.GetTempPath() no son la misma: imgbox.com/L1CDsEBe
  2. 13

    Descargo de responsabilidad: No es una respuesta -, pero importante, de la lectura !

    Es muy importante darse cuenta de que usted necesita para limpiar sus archivos temp, porque cuando usted golpea 65536 en un único directorio en el marco de no crear más y su aplicación va a explotar!

    Que se acumulan a lo largo de meses y meses y, a continuación, obtendrá un mensaje como este:

    System.IO.IOException: The file exists.
    
      at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
      at System.IO.__Error.WinIOError()
      at System.IO.Path.InternalGetTempFileName(Boolean checkHost)
      at System.IO.Path.GetTempFileName():

    y TFS le dará esta cuando intenta generar:

    TF215097: An error occurred while initializing a build for build 
    definition XXXXX: The file exists. 

    Todo lo que necesitas hacer es hacer es navegar a la Path.GetTempPath() la carpeta y llame del tmp*

    Nota: Si usted tiene un ASP.NET appliation la creación de archivos temporales de su directorio temp probablemente será diferente de la actual sesión del usuario

    En caso de duda (o pánico) acaba de crear una página aspx para imprimir la ubicación se utiliza:

     TempPath.aspx
     <%@ Page Language="C#"%>
     Temp path: <%= System.IO.Path.GetTempPath() %>

    Para mí cuando se ejecuta como NetworkService puedo obtener

     C:\Windows\TEMP\

    Cuando se ejecuta como un grupo de aplicaciones (denominado http://www.example.com) la ruta de acceso puede ser:

     C:\Users\www.example.com\AppData\Local\Temp

    PS. Creo que esto puede ocurrir incluso si elimina el archivo después porque el nombre del archivo aumenta.

    • Se metió en la oficina esta mañana con el sistema de producción de muertos. Resulta que uno de nuestros desarrolladores se fue con la Ruta de acceso.GetTempFileName() para generar al azar los nombres de archivo para su uso en otros lugares. Él no era consciente de que también la creación de un archivo de cero bytes en c:\windows\temp. El sistema debe tener trató de crear su 65537th archivo! Este comentario nos salvó horas de tiempo de inactividad. Gracias por publicar hace 2 años!
    • Para Futuras Comprobaciones : Como recuerdo de Ruta.GetTempFileName() método sólo devuelve algo como «_00001.tmp» y se incrementa en 1 cada llamada..Cuando se pone «_65537.tmp» -El recuento máximo de archivos-, la próxima convocatoria se trate de regresar «_00001.tmp» si el archivo no existe. Si Existe, entonces tira error..por Lo tanto, mejor es mantener limpio Temp nombre de archivo de Caché {simplemente cuando no la necesito, simplemente elimine el archivo}..Espero que ayude
    • Me gusta mantener las cosas bajo 32000 archivos sólo para estar en el lado seguro 😉 yo todavía no he averiguado por qué inmediatamente borrado de mi archivo tmp no es eliminarlo realmente – y no hay ninguna copia de seguridad o de protección de virus en ejecución que pueden causar los archivos bloqueados.
  3. 2

    Me he dado cuenta de GetTempPath() puede traer de vuelta el local de Documentos del usuario & Settings\usuario\Configuración Local\Temp ruta de acceso si es una aplicación de consola, y se dio cuenta de que pueden traer de vuelta a C:\WINDOWS\Temp (en el servidor) si se trata de una aplicación web que se corría de un cliente. En el primer caso, no es gran cosa – la cuenta que ejecuta la aplicación tiene los derechos de esa carpeta. En el segundo, tal vez es una gran cosa si la Aplicación de la cuenta de Identidad del grupo (o de la cuenta que usted puede utilizar para suplantar la identidad en la Web.archivo de configuración de la aplicación web) no tiene privilegios para C:\WINDOWS\Temp en el servidor (que es una gran oportunidad que no). Así que para mi consola de apps, justo lo que no hay duda de que los archivos temporales se han escrito para codificar una cadena en un archivo INI es el mejor y más fácil para mí, y para una aplicación web, que codificar en la web.config y conseguir que el uso de ConfigurationManager.AppSettings[«myKey»] funciona, o si se trata de una aplicación web, utilice esta función para enviar el archivo a la ASP Temporal de las carpetas de Archivos y trabajar con lo que hay:

    public static string findFileDirectory(string file)
    {
        //Get the directory where our service is being run from
        string temppath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        //Ensure proper path notation so we can add the INI file name
        if (!temppath.EndsWith(@"\")) temppath += @"\";
    
        return temppath;
    }

    y llamar las cosas como esta:

        string tempFolderPath = findFileDirectory("Web.config");
        tempFolderPath = tempFolderPath.Replace(@"\", @"\");

    y sólo tiene que utilizar «tempFolderPath» en lugar de en lugar de la Ruta.GetTempPath() antes. Esta función obras impresionante & yo lo uso en mi código en lugar de este mal GetTempPath() método, así que sé que mi aplicación se puede hacer lo que se debe hacer, ya que el ASP de los Archivos temporales de la carpeta debe tener todos los permisos que necesita para sus operaciones (DOMINIO\SERVICIO de RED y Aplicación de la Piscina de ID de cuenta de la necesidad de Control Total). tempFolderPath termina en una barra diagonal, por lo que sólo concat directamente con la variable/nombre de archivo para obtener el derecho de la ruta.

    -Tom

    P. S. Usted necesita agregar 2 espacios de nombres para hacer que la función de trabajo: Sistema.IO y del Sistema.Reflexión

  4. 1

    Por favor, trate de usar lo siguiente para determinar buen lugar para Sus datos:

    Environment.GetFolderPath(Environment.SpecialFolder folder);

    Donde Specialfolder

    //Summary:
    //    Specifies enumerated constants used to retrieve directory paths to system
    //    special folders.
    [ComVisible(true)]
    public enum SpecialFolder
    {
    //Summary:
    //    The logical Desktop rather than the physical file system location.
    Desktop = 0,
    //
    //Summary:
    //    The directory that contains the user's program groups.
    Programs = 2,
    //
    //Summary:
    //    The directory that serves as a common repository for documents.
    Personal = 5,
    //
    //Summary:
    //    The "My Documents" folder.
    MyDocuments = 5,
    //
    //Summary:
    //    The directory that serves as a common repository for the user's favorite
    //    items.
    Favorites = 6,
    //
    //Summary:
    //    The directory that corresponds to the user's Startup program group.
    Startup = 7,
    //
    //Summary:
    //    The directory that contains the user's most recently used documents.
    Recent = 8,
    //
    //Summary:
    //    The directory that contains the Send To menu items.
    SendTo = 9,
    //
    //Summary:
    //    The directory that contains the Start menu items.
    StartMenu = 11,
    //
    //Summary:
    //    The "My Music" folder.
    MyMusic = 13,
    //
    //Summary:
    //    The directory used to physically store file objects on the desktop.
    DesktopDirectory = 16,
    //
    //Summary:
    //    The "My Computer" folder.
    MyComputer = 17,
    //
    //Summary:
    //    The directory that serves as a common repository for document templates.
    Templates = 21,
    //
    //Summary:
    //    The directory that serves as a common repository for application-specific
    //    data for the current roaming user.
    ApplicationData = 26,
    //
    //Summary:
    //    The directory that serves as a common repository for application-specific
    //    data that is used by the current, non-roaming user.
    LocalApplicationData = 28,
    //
    //Summary:
    //    The directory that serves as a common repository for temporary Internet files.
    InternetCache = 32,
    //
    //Summary:
    //    The directory that serves as a common repository for Internet cookies.
    Cookies = 33,
    //
    //Summary:
    //    The directory that serves as a common repository for Internet history items.
    History = 34,
    //
    //Summary:
    //    The directory that serves as a common repository for application-specific
    //    data that is used by all users.
    CommonApplicationData = 35,
    //
    //Summary:
    //    The System directory.
    System = 37,
    //
    //Summary:
    //    The program files directory.
    ProgramFiles = 38,
    //
    //Summary:
    //    The "My Pictures" folder.
    MyPictures = 39,
    //
    //Summary:
    //    The directory for components that are shared across applications.
    CommonProgramFiles = 43,
    }
  5. 1

    Si usted está usando C# en MacOS utilizando Mono Framework entonces el valor devuelto por Path.GetTempPath() es el valor de la variable de entorno TMPDIR.

    Ejecución echo $TMPDIR generalmente se devuelve como valor :

    /var/folders/{2 character random-string}/{random-string}/T

Dejar respuesta

Please enter your comment!
Please enter your name here