#1091 closed defect (fixed)
Maximum filename length and OisStore
| Reported by: | Pedro Gea | Owned by: | Víctor de Buen Remiro |
|---|---|---|---|
| Priority: | high | Milestone: | |
| Component: | Various | Version: | |
| Severity: | critical | Keywords: | |
| Cc: |
Description
La función para la creación de archivos OZA está limitada a nombres (completos) de archivo (en Windows al menos) de menos de 255 caracteres. Sin embargo para nombres de 260 caracteres o más no se muestran mensajes de error aunque el guardado fracasa.
Esto puede comprobarse jugando con:
Real Ois.Store([[Real void = 1]], "C:/Temp/Long/"
<<Text SetSum(For(1, 234, Text (Real i) { "A" }))<<"/ej.oza");
// La longitud de este archivo será 254 (234+20)
Sería conveniente, si esta limitación no es evitable, avisar con un mensaje de error y con la respuesta de la función (a False) de que la creación del archivo no ha tenido éxito.
Change History (4)
comment:1 Changed 15 years ago by
| Status: | new → accepted |
|---|
comment:3 Changed 15 years ago by
| Resolution: | → fixed |
|---|---|
| Status: | accepted → closed |
comment:4 Changed 15 years ago by
Note: See
TracTickets for help on using
tickets.

la función de TOL
GetStandardAbsolutePathque devuelve el camino absoluto estandarizado llama en windows a la GetFullPathName que es la que tiene esas limitaciones que no podemos soslayar de ningún modo. Lo único que he podido hacer es que cuando no funcione capturar el mensaje del sistema operativo y mostrárselo al usuario.He hecho la siguiente comprobación en mi máquina
//////////////////////////////////////////////////////////////////////////// //Comprueba si puede Ois.Store puede crear un path de longitud dada y en //caso contrario comprueba si se emite el correspondiente mensaje de error Real checkLongPath(Real pathLength) //////////////////////////////////////////////////////////////////////////// { Real numErr.0 = Copy(NError); Text path = "/Temp/Long/" <<Text SetSum(For(1, pathLength-18, Text (Real i) { "A" }))<<"/ej.oza"; Real len = TextLength(path); Real Ois.Store([[Real void = 1]], path); Set aux = { Include(path) }; Real created = If(ObjectExist("Real","aux::void"),aux::void,0)==1; Real OSFilRemove(path); Real numErr = Copy(NError)-numErr.0; WriteLn("[checkLongPath] " "len="<<len+" created="<<created+" errors="<<numErr); If(created,numErr==0,numErr>0) }; Real ok.251 = checkLongPath(251); Real ok.252 = checkLongPath(252); Real ok.253 = checkLongPath(253); Real ok.259 = checkLongPath(259); Real ok.260 = checkLongPath(260); Real ok.261 = checkLongPath(261);En todos los casos se comporta ahora correctamente: hasta 252 crea el archivo sin problemas y apartir de 253 es incapaz pero al menos da un error.