Newsgroup: it.comp.lang.delphi
Titolo: Verifica validità nome file

Esiste una funzione in Delphi 5 che verifichi se il nome file inserito è
corretto, usando gli stessi criteri di quando Windows visualizza un
messaggio d'errore se l'utente ha inserito un nome file non valido.
Questo per evitare di dover scoprire tutti i controlli effettuati da
Windows e soprattutto per avere un controllo indipendente dalla versione
di Windows (anche se molto probabilmente le differenze saranno minime).
Grazie in anticipo.
Alessandro
--- posted by geoForum on 
http://www.delphiedintorni.it


In quale constesto hai questa necessità? Devi creare un file
il cui nome è scelto dall'utente?
Hai due possibilità:
1) usi il componente "SaveDialog";
2) Crei il file con la CreateFile e gestisci eventuali eccezioni,
tipo:
Handle := INVALID_HANDLE_VALUE;
try
  Handle := CreateFile(NOMEFILE, GENERIC_READ,
        FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if Handle = INVALID_HANDLE_VALUE then
        raise Exception.Create(SysErrorMessage(GetLastError));
    except on e: Exception do
      // gestisci l'errore
end;
Ciao
-- 
ACSH
[D4]
Chi fa da se', fatica il doppio 

 messaggio d'errore se l'utente ha inserito un nome file non valido.
Non che io sappia.  Non mi sovviene neanche un'API di Windows.
In ogni caso, un test sul nome del file è banale da implementare.
Basta scrivere un parser in stile con quello che segue (scritto al volo,
dovrebbe essere corretto ed espandibile per gestire caratteri jolly,
percorsi di rete, ecc...).  E' facile ricostruire l'automa a stati finiti
su cui è basato.
function ValidateFileName(const AFileName: String): Boolean;
var
  State: Integer;
  FileName: String;
  procedure EatCharAndJumpToState(const ANewState: Integer);
  begin
    Delete(FileName, 1, 1);
    State := ANewState;
  end;
begin
  FileName := UpperCase(Trim(AFileName));
  Result := FileName <> '';
  State := 1;
  while Result and (State <> 0) do
  begin
    if (FileName = '') then
    begin
      Result := (State in [2,5]);
      State := 0;
    end
    else
      case FileName[1] of
        '0'..'9', 'A'..'Z', '_': begin
           case State of
             1: EatCharAndJumpToState(2);
             2,4,5,6: EatCharAndJumpToState(5);
           else
             Result := False;
           end;
        end;
        '.': begin
          case State of
            2: EatCharAndJumpToState(6);
            6: EatCharAndJumpToState(2);
          else
            Result := False;
          end;
        end;
        ':': begin
          case State of
            2: EatCharAndJumpToState(3);
          else
            Result := False;
          end;
        end;
        '/', '\': begin
          case State of
            1,2,3,5: EatCharAndJumpToState(4);
          else
            Result := False;
          end;
        end;
      end;
  end;
end;
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

             2: EatCharAndJumpToState(6);
Errata Corrige:
 >             2,5: EatCharAndJumpToState(6);
;-)

[...]
Grazie, comunque speravo ci fosse una funzione già fatta che usasse gli
stessi criteri che usa Windows quando un utente inserisce il nome di un
file, per fare in modo che il controllo fosse indipendente dalla versione
di Windows (da notare che alcune volte non viene visualizzato nessun
messaggio d'eccezione da programma anche se la stessa operazione fatta
manualmente su Windows da errore, per esempio se inserisco come nome file
".txt"). Lo so che in realtà si tratta di problemi trascurabili però
speravo comunque di risolverli.
Comunque farò la funzione manualmente visto che non c'è altro modo.
Saluti.
