Estoy tratando de usar os.tmpname() de Lua en Windows (que usa tmpnam() debajo del capó), y estoy un poco desconcertado por los nombres de archivo que está devolviendo.
> print(os.tmpname()) \s3e8. Si lo envío directamente a Lua como io.open(os.tmpname(), "w") , intentará crear el archivo en el directorio raíz de la unidad actual. Esto parece bastante inapropiado, ya que a menudo no tenemos permiso para hacerlo.
Pero según este hilo:
https://mingw-users.narkive.com/L7VR1gxX/temporal-file-woes
Aparentemente, se supone que es una ruta relativa al directorio actual. Mencionaron este fragmento de una documentación de Microsoft:
Tenga en cuenta que cuando un nombre de archivo se antepone con una barra invertida y sin información de ruta, como \fname21, esto indica que el nombre es válido para el directorio de trabajo actual.
Pero ya no puedo encontrar la documentación que mencionaron en el hilo. Busqué en Google, tratando de encontrar la documentación más reciente y encontré esto: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/tempnam-wtempnam-tmpnam-wtmpnam?view=msvc- 160
Estas son las reglas de generación mencionadas en la documentación anterior:
_tempnam generará un nombre de archivo único para un directorio elegido por las siguientes reglas:
Si la variable de entorno TMP se define y establece en un nombre de directorio válido, se generarán nombres de archivo únicos para el directorio especificado por TMP.
Si la variable de entorno TMP no está definida o si se establece en el nombre de un directorio que no existe, _tempnam utilizará el parámetro dir como la ruta para la que generará nombres únicos.
Si la variable de entorno TMP no está definida o si se establece en el nombre de un directorio que no existe, y si dir es NULL o se establece en el nombre de un directorio que no existe, _tempnam utilizará el directorio de trabajo actual para generar nombres únicos. Actualmente, si tanto TMP como dir especifican nombres de directorios que no existen, la llamada a la función _tempnam fallará.
Tengo definida la variable de entorno TMP , pero Lua siempre genera el tipo de rutas que mencioné en la parte superior.
Así que realmente, tengo dos preguntas:
TMP estándar?Estoy probando esto con Lua 5.2 de LuaBinaries y el Lua integrado estáticamente en las compilaciones mpv de shinchiro .
De acuerdo con este hilo en lua-users.org, puede intentar pasar nulo.
bueno, lo resolví usando tmpname(NULL,NULL)... considera el directorio temporal del sistema. cuando uso tmpnam() en Windows en una raíz que no se puede escribir, el nombre de archivo generado (\algo) no se puede escribir... supongo que es un error de implementación
También tenga en cuenta el Manual de referencia de Lua 5.2
Cuando sea posible, puede preferir usar io.tmpfile , que elimina automáticamente el archivo cuando finaliza el programa.