validfilename

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

validfilename

Beitrag von arturx »

--> Gibt es eine function, die checkt, ob ein filename überhaupt zulässig ist ?

so etwas wie: function validfilename(fname : string) : boolean;

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: validfilename

Beitrag von gocher »

ungefähr so:

Code: Alles auswählen

 
function IsValidFileName(const fileName : string) : boolean;
 const InvalidCharacters : set of char = ['\', '/', ':', '*', '?', '"', '<', '>', '|'];
 var cnt : integer;
 begin
   result := fileName <> '';
    if result then
   begin
     for cnt := 1 to Length(fileName) do
     begin
       result := NOT (fileName[cnt] in InvalidCharacters) ;
       if NOT result then break;
     end;
   end;
 end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: validfilename

Beitrag von creed steiger »

Plattformübergreifend eher schwierig
für Windows sowas
http://stackoverflow.com/questions/3783 ... a-filename

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: validfilename

Beitrag von mschnell »

creed steiger hat geschrieben:Plattformübergreifend eher schwierig
Hat mit der "Plattform" wenig zu tun,m sondern mit angesprochenen verwendeten Datei-System. In Linux kann man ja auch z.B. FAT verwenden, das seine eigenen Einschränkungen hat.

In einem "echten" Linux-Dateisystem (z.B. EXTx und NFS) ist - soweit ich weiß - jede Byte-Folge als Dateiname zulässig, die höchstens 255 Zeichen lang ist und keinen ASCII-Schrägstrich enthält.

Wie so ein Dateiname angezeigt wird, ist aber eine andere Frage und hat mit dem Dateisystem nichts zu tun (die meisten Programme / Umgebungen verwenden dabei heutzutage UTF-8)

-Michael

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: validfilename

Beitrag von arturx »

Vielen Dank für die vielen propmpten Anregungen !!!

Mein Resumee aus allen ist:

1.validfilename muss wohl Dateisystemspezifisch codiert werden :
(mittels compilerschalter oder individualisierter methoden)
2.Meine "standard" Version für Windows is unten zu sehen. In die methode habe ich sicherheitshalber alle "forbidden Chars" eingefügt,
da ich keine exotischen Namen brauche in meinen Anwendungen (mehr zu den forbidden Chars : siehe auch Hinweis Creed Steiger)

Code: Alles auswählen

function Tfoinifiledit.validfilename(filenamewithpath: string): boolean;
     var filename : string;
// ......................................
function checkfor(reserved : array of string) : boolean;
     var a : integer;
   begin result  := true;
         for a := 0 to high(reserved) do
             begin If pos(reserved[a],filename)>0
                      then exit;
             end;
         result := false;
   end;
// :::::::::::::::::::::::::::::::::::::
   const ForbiddenChars : set of Char = [';', '=', '+', '<', '>', '|','[', ']','\', '/,':','?','!',,'"',''''];
     var i : integer;
   begin result := false;
         If trim(filenamewithpath)=''
            then exit;
         If not DirectoryExists(extractfiledir(filenamewithpath))
            then exit; // alternative could be : create a new directory
         filename := Uppercase(sysutils.ExtractFileName(filenamewithpath));
         For i := 0 to length(filename) do
            begin If filename[i] in forbiddenchars
                     then exit;
             end;
         If checkfor(['CON','PRN','AUX','NUL',
                     'COM1','COM2','COM3','COM4','COM5','COM6','COM7','COM8','COM9',
                     'LPT1','LPT2','LPT3','LPT4','LPT5','LPT6','LPT7','LPT8','LPT9'])
            then exit;
         result := true;
 end;
 

Antworten