{ Here is a routine I used. It forces entry of a proper filename, not quite what you're looking for, but close: } uses Crt; const OKFNameChars = ['A'..'Z','a'..'z','0'..'9','$','%','''', '-','@','{','}','~','`','!','#','(',')','&']; procedure Backspace; begin gotoxy(wherex-1,1);write(' ');gotoxy(wherex-1,1); end; function GetFileName(Prompt : string) : string; var OKCharSet : set of char; ch : char; Done : boolean; Name : string; len : byte absolute Name; begin OKCharSet := OKFNameChars + ['.',#8,#13,#27]; write(Prompt); Done := false; Name := ''; repeat repeat ch := upcase(readkey); until (ch in OKCharSet); case ch of #8 : if len > 0 then begin Backspace; dec(len); end; #13 : Done := true; #27 : begin while len > 0 do begin Backspace; dec(len); end; Done := true; end; '.' : if (len > 0) and (pos('.',Name) = 0) then begin write('.'); Name := Name + '.'; end; else if ((pos('.',Name) = 0) and (len < 8)) or (len - pos('.',Name) < 3) then begin Name := Name + ch; write(ch); end; end; { case } until Done; writeln; GetFileName := Name; end; { test follows } var fname : string; begin clrscr; repeat fname := GetFileName('Enter file name: '); until fname = ''; end.