c - Hvordan kan jeg validere, om en fil er gyldigt i Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Er der en Windows API-funktion, som jeg kan overføre en strengværdi til, der vil returnere en værdi, der angiver, om et filnavn er gyldigt eller ej?


Jeg skal kontrollere, at et filnavn er gyldigt, og jeg søger en nem måde at gøre uden at genfinde hjulet. Jeg arbejder i lige C, men målretter mig mod Win32 API.


Hvis der ikke er en sådan funktion indbygget, hvordan skal jeg gå om at skrive min egen? Er der en generel algoritme eller et mønster, som Windows følger for at bestemme filnavnets gyldighed?

Bedste reference


Problemet er ikke så simpelt, fordi det afhænger af, hvad du anser for et 'gyldigt filnavn'.


Windows API'erne, der bruges sammen med UNC-stier, giver dig lykkeligt mulighed for at oprette mange navne, der anses for ugyldige inden for normale stier, da med præfikset \? fortæller du til Windows API'erne for blot at levere stien til filsystemdriveren, uden at foretage nogen kontrol filsystemerne selv er ofte ikke rigtig interesserede i, hvad det er brugt som et filnavn, når de ved, at en eller anden streng kun er filnavnet (dvs. stien/navneopdelingen er allerede udført), behandler de det generelt som en uigennemsigtig sekvens af tegn.


På den anden side, hvis du vil spille det sikkert, skal du udføre validering i henhold til reglerne angivet i MSDN-dokumentet, du allerede har linket til Win32-navne; Jeg tror ikke, at et hvilket som helst filsystem har lov til at have strengere regler end dem, der er navngivet på fil. På den anden side kan krænkelse af sådanne krav, selvom det understøttes af kernen selv, ofte give dårlig hovedpine til mange 'normale' applikationer der forventer at håndtere 'traditionelle' Win32 stier. [11]


Men efter min opfattelse, hvis du er nødt til at oprette filen straks, kan du bedst prøve at faktisk oprette/åbne filen , lade OS gøre sådant arbejde for dig og være forberedt på at håndtere yndefuldt en fiasko (GetLastError skal returnere ERROR\_BAD\_PATHNAME). Dette kontrollerer enhver anden begrænsning, du har på oprettelsen af ​​en sådan fil, f.eks. at din ansøgning har de relevante tilladelser, at stien ikke er på et læseligt medium, ...


Hvis dette af en eller anden grund ikke er muligt, kan du lide shell-funktionen PathCleanupSpec: Forudsat det ønskede filnavn og mappen i filsystemet, hvor den skal oprettes, fjerner denne funktion alle de ugyldige tegn (Jeg er ikke sikker på reserverede DOS-navne, de er ikke angivet i dokumentationen), der gør banen 'sandsynligvis gyldig' og meddeler dig, om der er foretaget nogen ændringer (så du kan også bruge den også kun til validering). [12]]]


Bemærk, at denne funktion er markeret som 'modificerbar eller flytbar i enhver fremtidig Windows-version', selv om Microsoft-politikken generelt er, at 'alt, der gjorde det til en offentlig overskrift, forbliver offentligt for evigt'.

Andre referencer 1


Hvis du kontrollerer, om filnavnet er gyldigt i den forstand 'kan filen hedde dette?' :


Nej, der er ingen funktion til direkte at kontrollere det. Du bliver nødt til at skrive din egen funktion.


Men hvis du ved, hvad der er et gyldigt filnavn (det gyldige filnavn indeholder nu et af følgende: / : * ? " < > |) der burde ikke være et sådant problem.


Du kan måske hjælpe dig selv med nogle af disse funktioner fra ctype.h (med dem kan du tjekke, om en bestemt karakter tilhører nogle specifikke karakterklasser):


http://www.cplusplus.com/reference/clibrary/cctype/[13]

Andre referencer 2


Denne funktion giver dig en liste over ugyldige tegn for et filnavn. Op til dig for at kontrollere, at dit filnavn ikke indeholder nogen:


public static char[] Path.GetInvalidFileNameChars()


Dokumenter her. [14]


Bemærk, at hvis du vil validere et katalognavn, skal du bruge GetInvalidPathChars().


EDIT: Oooops! Undskyld, jeg troede, du var på .NET. Ved hjælp af Reflector, her er hvad disse funktioner koger ned til:


'"', '<', '>', '|', 
'', 'x0001', 'x0002', 'x0003', 'x0004', 'x0005', 'x0006', 
'a', '', '	', '
', 'v', 'f', '
', 
'x000e', 'x000f', 'x0010', 'x0011', 'x0012', 'x0013', 'x0014', 'x0015', 
'x0016', 'x0017', 'x0018', 'x0019', 'x001a', 'x001b', 'x001c', 'x001d', 
'x001e', 'x001f', 
':', '*', '?', '\', '/'


Bemærk at der også er reserverede navne som prn, con, com1, com2,... , lpt1, lpt2,...