close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

Closed 14 years ago

Last modified 14 years ago

#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 14 years ago by Víctor de Buen Remiro

Status: newaccepted

la función de TOL GetStandardAbsolutePath que 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.

comment:2 Changed 14 years ago by Víctor de Buen Remiro

(In [3165]) Refs #1091

comment:3 Changed 14 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: acceptedclosed

(In [3166]) Fixes #1091
GetStandardAbsolutePath shows an error message if GetFullPathName fails

comment:4 Changed 14 years ago by Víctor de Buen Remiro

(In [3167]) Refs #1091
ShowLastError cannot be static due to must be called from GetStandardAbsolutePath at dir.cpp

Note: See TracTickets for help on using tickets.