Har ingen erfaringer det problem, men her er nogle løse tanker.
Dit problem ligger lidt op ad en meget light udgave af et versionskontrolsystem. Som jeg forstår problemet er det at tage en
mængde af mappestrukturer og finde frem til en
enkelt mappestruktur.
Lad os antage du har fundet en gruppe (f.eks. i en List<T> ) af filer du mener er den samme fil i forskellige udgaver. Den gruppe bliver nu opdelt i flere grupper hvis der er afvigelser i f.eks. størrelse eller dato. Sorter filerne efter attributter de ikke må afvige på for at være den samme. Det er attributter på størrelse, dato og så videre. Hvis to filer har samme størrelse, sorterer du i stedet efter dato, osv.. Det er ligegyldigt hvilken attribut du prioriterer først, og om du ordner efter "<" eller ">", f.eks. om datoen er tidligere eller senere. (note: hvis 2 filer har samme størrelse kan det være nødvendigt at læse dem igennem for at se om de er ens.)
Nu er det nemt at indsætte dem i ækvivalensrelationer, dvs. grupper som er ens. Vælg den første fil i den sorterede liste, og check den op mod resten. Så snart den afviger tager du alle dem du nåede at checker om i mod, og smider i en collection. Så fortsætter du med resten. Her er et eksempel med nogle filer der er den "samme":
MappeA\Sti\MinDataFil.extension, 19kB, 17/06
MappeB\Sti\MinDataFil.extension, 21kB, 14/06
MappeC\Sti\MinDataFil.extension, 19kB, 17/06
MappeD\Sti\MinDataFil.extension, 21kB, 15/06
MappeE\Sti\MinDataFil.extension, 19kB, 16/06
Efter du har sorteret, størrelse først, derefter dato.
MappeE\Sti\MinDataFil.extension, 19kB, 16/06
MappeA\Sti\MinDataFil.extension, 19kB, 17/06
MappeC\Sti\MinDataFil.extension, 19kB, 17/06
MappeB\Sti\MinDataFil.extension, 21kB, 14/06
MappeD\Sti\MinDataFil.extension, 21kB, 15/06
Nu kan de så inddeles i ækvivalensrelationer. Vi bliver ved med at "tage" indtil attributterne varierer:
1:
MappeE\Sti\MinDataFil.extension, 19kB, 16/06
2:
MappeA\Sti\MinDataFil.extension, 19kB, 17/06
MappeC\Sti\MinDataFil.extension, 19kB, 17/06
3:
MappeB\Sti\MinDataFil.extension, 21kB, 14/06
4:
MappeD\Sti\MinDataFil.extension, 21kB, 15/06
Læg mærke til at der kun er 4 grupper, mens der var 5 filer. Du behøver kun at tage en beslutning, dvs. vælge blandt en af disse 4 grupper, siden begge filer i gruppe #2, repræsenterer den samme. Hvis du kun endte op med en relation betyder at at alle dine filer er ens og der ikke er grund til nogen beslutning, du kan blot overføre hvilken som helst af filerne videre til din resultats-mappestruktur.
Hvordan finder du så gruppen af filerne der kan være ens? Du går bare gennem mappestrukturerne samtidig og noterer filer med samme navn. Filer der ikke findes i alle mappestrukturerne er enten blevet tilføjet eller fjernet så der er nødt til at blive taget en beslutning. Hvis du laver et GUI hvor man tager beslutningerne kan du måske antage at filerne er nye hvis de ikke findes i alle mappestrukturerne. Man kan så "beslutte" at fjerne dem hvis nødvendigt.
Hvad med omdøbninger? En løsning her kunne være at sortere alle filerne efter størrelse efter de er fundet. Hvis filer har samme størrelse kan du checke om de samme indhold. Men der er ikke nogen rigtig løsning her, for selv hvis de har samme størrelse kan det jo være meningen der skal være en kopi under andet navn.
En måde at håndtere stierne på kunne være en rekursiv datastruktur, hvis .NETs faciliteter ikke er tilstrækkelige eller der du vil understøtte flere platform kunne strukturen være noget i stil med:
- class Folder {
- Dictionary<string, File> files;
- Dictionary<string, Folder> subfolders;
- }
Hvor hver mappestruktur er der sådan en rod-"Folder", som du så dykker ned i samtidigt. Hvis du har mapper A, B, C, og du går ned i A\MinMappe, gør du det samme for Folder-objektet for B og C.
Hvis du laver noget grafisk, kunne du eventuelt kigge efter om der findes nogle diff-biblioteker du kan integrere.
Indlæg senest redigeret d. 24.10.2014 13:53 af Bruger #14645