Newsgroup: it.comp.lang.delphi
Titolo: Coerenza nomi di file (Windows/Linux)

Ciao,
non riesco a trovare una funzione (Windows, Delphi,...) che mi controlli un
nome di file. Nel caso questi non rispetti le convenzioni del file system mi
sostituisca i caratteri "proibiti".
qualcuno puň aiutarmi ?
grazie in anticipo.

sostituisca i caratteri "proibiti".
Il codice che segue potrebbe essere un buon punto di partenza: serve
per controllare la presenza di caratteri 'proibiti' nel nome di un
file. Aggiungere codice per la sostituzione automatica dei caratteri
errati non dovrebbe essere un problema.
const
  { for short 8.3 file names }
  ShortForbiddenChars : set of Char = [';', '=', '+', '<', '>', '|',
                                       '"', '[', ']', '\', ''''];
  { for long file names }
  LongForbiddenChars  : set of Char = ['<', '>', '|', '"', '\'];
function TestFilename(Filename: String; islong: Boolean) : Boolean;
var
  I: integer;
begin
  Result := Filename <> '';
  if islong then
  begin
    for I := 1 to Length(Filename) do
      Result := Result and not (Filename[I] in LongForbiddenChars);
  end else
  begin
    for I := 1 to Length(Filename) do
      Result := Result and not (Filename[I] in ShortForbiddenChars);
  end;
end;
-- 
La storia insegna che la storia non insegna nulla.
http://web.tiscali.it/mbsoftware

sostituisca i caratteri "proibiti".
AFAIK, una funzione del genere non esiste.
In ogni caso, conoscendo le regole della "grammatica" del proprio
file-system, non è difficile costruire un automa a stati finiti per il
suo controllo.  Il seguente dovrebbe funzionare a dovere, l'ho scritto
al volo, controllalo:
{
[0] A..Z ---> [1]
    \    ---> [2]
----------------------------------------------
[1] :    ---> [2]
    A..Z ---> [3]
    \    ---> [4]
    END
----------------------------------------------
[2] A..Z ---> [3]
    \    ---> [4]
----------------------------------------------
[3] A..Z ---> [3]
    \    ---> [4]
    .    ---> [4]
    END
----------------------------------------------
[4] A..Z ---> [3]
----------------------------------------------
}
const
  AllowedChars = ['A'..'Z', 'a'..'z', '0'..'9', '_'];
  EndOfString = 0;
  EndOfCheck = -1;
function CheckFileName(const P: String): Boolean;
var
  Stato, C: Integer;
  Res: Boolean;
  S: String;
  function NextChar: Integer;
  begin
    if S = '' then Result := EndOfString
    else
    begin
      Result := Ord(S[1]);
      Delete(S, 1, 1);
    end;
  end;
  procedure ExitWithError;
  begin
    Res := False;
    Stato := -1;
  end;
begin
  S := P;
  Res := True;
  Stato := 0;
  while (Stato <> EndOfCheck) do
  begin
    C := NextChar;
    case Stato of
      0: begin
           if Char(C) in AllowedChars then Stato := 1
           else
           if Char(C) = '\' then Stato := 2
           else ExitWithError;
         end;
      1: begin
           if Char(C) = ':' then Stato := 2
           else
           if Char(C) in AllowedChars then Stato := 3
           else
           if Char(C) = '\' then Stato := 4
           else
           if C = EndOfString then Stato := EndOfCheck
           else ExitWithError;
         end;
      2: begin
           if Char(C) in AllowedChars then Stato := 3
           else
           if Char(C) = '\' then Stato := 4
           else ExitWithError;
         end;
      3: begin
           if Char(C) in AllowedChars then Stato := 3
           else
           if Char(C) = '\' then Stato := 4
           else
           if Char(C) = '.' then Stato := 4
           else
           if C = EndOfString then Stato := EndOfCheck
           else ExitWithError;
         end;
      4: begin
           if Char(C) in AllowedChars then Stato := 3
           else ExitWithError;
         end;
    end;
  end;
  Result := Res;
end;
-- 
Andrea Laforgia
"God is dead." -- Nietzsche
"Nietzsche is dead." -- God