escribir un archivo en %TEMP% falla silenciosamente

Tengo esta función que escribe en mi archivo de registro. Está fallando en silencio. En el sentido de que no se generan errores en esta función, simplemente no se puede crear o escribir en el archivo. Estoy tratando de escribir a %TEMP%\myappname.log. También falla en %USERPROFILE%\Desktop\myappname.log. El servidor es Windows Server 2008 R2 Standard. Me encontré con esto al escribir en la carpeta de la aplicación con otros programas, así que pasé a escribir en el %TEMP% directorio y esto lo resolvió. Pero este sistema ni siquiera me deja escribir al %TEMP% directorio. Sí, también intenté ejecutar como administrador y no ayudó. %TEMP% en este caso se resuelve a través de ExpandEnvironmentStrings a C:\Users\sa\AppData\Local\Temp\2 Entonces g_strLogPath es C:\Users\sa\AppData\Local\Temp\2\myappname.log.

Public Function LogMessage(ByVal strInput As String, Optional ByVal blnDate As Boolean = False) As Boolean

   Dim intFileNumber As Integer

   On Error GoTo ErrorHandler

   If g_lngLogLevel <> 1 Then
      Exit Function
   End If

   If Len(g_strLogPath) = 0 Then
      SetLogPath
   End If

   If blnDate Then
      strInput = Format(Now, cstrLogDateFormat) & " : " & strInput
   End If

   intFileNumber = FreeFile
   Open g_strLogPath For Append As #intFileNumber
   Print #intFileNumber, strInput
   Close #intFileNumber

   LogMessage = True

   Exit Function

ErrorHandler:

   MsgBox _
      "Error: " & Err.Number & vbCrLf & _
      "Location: Module1.LogMessage" & vbCrLf & _
      "Line: " & Erl & vbCrLf & _
      Err.Description, vbExclamation + vbOKOnly

End Function

preguntado el 03 de mayo de 12 a las 21:05

El fragmento de código no parece mostrar la ruta que está utilizando, entonces, ¿cómo sabemos que es realmente %TEMP%? (Podría ser suficiente comentar cuál es el valor de g_strLogPath resulta ser.) -

código revisado para agregar la ruta completa del archivo de registro -

3 Respuestas

Prueba esta

Sub GetTmpPath()
    'This will give the Temp Path
    MsgBox IIf(Environ$("tmp") <> "", Environ$("tmp"), Environ$("temp"))
End Sub

Así que puedes intentar usarlo como

    Ret = IIf(Environ$("tmp") <> "", Environ$("tmp"), Environ$("temp"))

    g_strLogPath = Ret & "\Sample.Log"

    Open g_strLogPath For Append As #intFileNumber

contestado el 03 de mayo de 12 a las 22:05

Esta función parece devolver una cadena en blanco. Uso ExpandEnvironemntStrings con %TEMP% para obtener la ruta temporal. Funciona bien. El problema no es obtener la ubicación temporal en la que está escribiendo. La aplicación no puede escribir en él, el usuario puede escribir en él. - Will Rickards

Msgbox TempPath & "Sample.txt" Si pones esto en el Sub TmpPath() ¿qué sacas? y luego tratar de usarlo como Open g_strLogPath For Append As #intFileNumber ¿Lo que pasa? - Huida de Siddharth

TempPath devuelve una cadena en blanco - Will Rickards

¿Qué te da esto? MsgBox IIf(Environ$("tmp") <> "", Environ$("tmp"), Environ$("temp"))? - Huida de Siddharth

C:\Usuarios\sa\AppData\Local\Temp\2 - Will Rickards

Intenta usar GetTempPath en lugar de Environ$("TEMP") para obtener la carpeta temporal.

Si el usuario actual no tiene permisos de escritura en la carpeta TEMP, muchos componentes del sistema también fallarán.

contestado el 03 de mayo de 12 a las 21:05

El usuario es local para la máquina (no es una cuenta de red). El usuario es miembro del grupo de administradores locales. Debe tener permisos completos. Puedo instalar programas muy bien. - Will Rickards

Las aplicaciones antivirus son bien conocidas por realizar escrituras irregulares en la carpeta temporal. - Deanna

@Deanna: La protección en tiempo real Duda trata la carpeta TEMP de manera diferente. OP está usando un escritorio remoto (es por eso que obtiene 1, 2 y así sucesivamente al final de TEMP) y probablemente tenga algunas configuraciones incorrectas en RDS, política de grupo o permisos de archivo. - wqw

@wqw: McAffee al menos tenía la opción de deshabilitar los ejecutables en la carpeta %TEMP%, y eso está lejos de ser lo peor que he visto. - Deanna

El problema era la comprobación de nivel de registro. En realidad, nunca llegó a las declaraciones abiertas o impresas.

Tenía tres niveles de registro definidos 0 = sin registro 1 = todo 2 = solo errores

Se configuró en 2 y LogError llamó a LogMessage, que verificó si el nivel de registro <> 1 y, por lo tanto, nunca se ejecutó.

contestado el 03 de mayo de 12 a las 22:05

La práctica normal es tener los niveles de registro en orden de verbosidad. Parece que has intercambiado "todo" y "solo errores". - Deanna

Nunca quiero desactivar el registro de errores, así que simplemente lo cambié a un indicador de registro detallado booleano. Y solo genere el tipo de seguimiento de la pila cuando sea detallado, pero siempre generará los errores. - Will Rickards

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.