windows - Win32 funktion til at fortælle om en fil er efterkommer af bibliotek

Indlæg af Hanne Mølgaard Plasc

Problem



I C ++, Windows, har jeg 2 filstier:



  • Sti1 : Katalog

  • Sti2 : Fil eller mappe



Hvordan kan jeg vide, om Path2 er en efterkommer af Path1? Er der en Shell-funktion til det? Jeg har søgt Shell API og kunne ikke finde nogen.


Bemærk: Jeg vil ikke sammenligne strengen selv, medmindre der er en sikker måde at gøre stien sammenlignelig (håndtere korte navne, relative elementer osv. ..).

Bedste reference


Du kan bruge PathCommonPrefix til at sammenligne de to stier for at få et fælles præfiks. Sammenlign derefter det fælles præfiks til Path1 (dit bibliotek). [9]


Hvis de to er ens, skal Path2 være en efterkommer.


Eller du kan måske komme væk uden at bruge en out buffer og bare videregive NULL til den tredje parameter og kontrollere, at returværdien, som er tællingen af ​​almindelige præfiks-tegn, svarer til Path1 længde.


Fra eksempelet PathCommonPrefix s doktrin ser det ikke ud som PathCommonPrefix indeholder efterfølgende katalogafspillere i det 'almindelige' præfiks, så du skal fjerne den efterfølgende sep i Path1 eller juster din sammenligning af resultatet i overensstemmelse hermed for manglende efterfølgende sep.

Andre referencer 1


Jeg tror ikke, at der er en praktisk funktion i API'en til at svare på dette for dig. Men jeg tror heller ikke det er for svært at skrive en robust funktion til at gøre dette. Her er oversigten:



  1. Kontrollerer, at sti1 og sti2 er absolutte stier.

  2. Kontroller, om sti1 og sti2 henviser til samme filsystemobjekt (mere nedenfor).

  3. Hvis det er tilfældet, returnerer din funktion sand.

  4. Hvis ikke stryge fornavnet fra Path2, dvs. fjern den endelige stilseparator (\ eller/) og alt, der følger det.

  5. Hvis trin 4 ikke fjernede nogen tekst (f.eks. der er ingen stedseparatorer tilbage), har du nået rodniveauet, og din funktion returnerer falsk.

  6. Gå til 2.



Nu skal du kontrollere, at to navne henviser til samme filsystemobjekt. Den sikreste måde at gøre det på er at kalde GetFileInformationByHandle() for begge navne og sammenligne dwVolumeSerialNumber, nFileIndexLow, nFileIndexHigh. Hvis alle er ens, henviser de to navne til det samme objekt. [10]


Bemærk, at det ikke er nok at sammenligne strenge, fordi en enkelt filsystemobjekt kan have mange forskellige navne. For eksempel hardlinks, symlinks, junctions, UNC vs kortlægede drevbogstaver og så videre.