[C#] Ondersteunen van archiveringsformaten

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Ja, beetje ongelukkige topictitel. Want dit topic slaat niet specifiek alleen op C# (het kan ook in andere programmeertalen), maar ik werk zelf in C# met dit project, dus vandaar.

Onder archiveringsformaten versta ik dus rar, zip, 7zip, ace, lzh, lha, arj, etc. etc. etc.

Nu is het grote probleem dus: Hoe kan ik dit op een beheerbare en nette manier ondersteunen?

Ik kan bijvoorbeeld wel een set classes vinden die me met rar-bestanden laat werken en een andere set classes die me met zip bestanden laat werken en wéér een andere set classes die me met 7zip laat werken.

Maar dat schiet niet echt op, want zo moet ik voor elk type bestand andere code gaan maken etc.

Nu zie ik op Google bijvoorbeeld wel een hele hoop programma's die waslijsten aan formaten ondersteunen. Ze lijken het te ondersteunen alsof het niets is. Terwijl ik dat nou niet echt als iets makkelijks zie, dat op zo'n simpele manier gedaan kan worden.

Het enige dat ondersteund moet worden qua formaten is het uitlezen van de bestandsstructuur (bestanden en mappen), waarbij de volgende gegevens belangrijk zijn:
  • Bestandsnaam
  • Bestandsgrootte
  • Bestandsgrootte (ingepakt)
  • CRC 32/16/8
  • Evt. laatst gewijzigd datum
Het uitpakken is niet nodig, archieven maken en wijzigen is al helemaal niet nodig.

Nu is dit ook niet echt een topic waar ik een kant en klare oplossing wil hebben of echt met een programmeerprobleem zit. Ik zit meer met het probleem:
Hoe moet ik het aanpakken zodat het op een flexibele manier (die niet veel "gedoe" oplevert) werkt?
Of is er toevallig al een standaard library die ondersteuning biedt voor een hoop formaten?

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je zult toch stuk-voor-stuk de formaten moeten gaan ondersteunen en dus de formaatspecifieke code in je project opnemen. Maar het hele idee achter OOP is (o.a.) abstractie en encapsulatie; schrijf dus een "archivemanager" class die het uitpeuteren van de informatie uit de verschillende soorten archieven voor je afhandelt en op een uniforme manier de gegevens aanlevert aan de rest van je project. Zo heb je een enkel object dat je kunt aanspreken voor de gewenste informatie en hoe dat ding dan z'n informatie uit een archief peuters is, voor de rest van je project, niet interessant.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Tsja, ik vermoed dat er niets anders opzit dan voor elk type bestand andere code te gaan maken. Het zijn namelijk verschillende bestandjes.

Meeste formaten zijn wel code-voorbeelden van op het net te vinden, sommige zijn voor een groot deel overlappend / compatibel dus dat scheelt al een boel.

En zo spannend hoeft die code nou ook weer niet te zijn als je alleen maar een filelist wilt genereren, meeste formaten slaan dit toch apart op.

Alternatief is anders om naar een /meerdere dll's te gaan kijken die al deze code al in zich heeft. Maar dit heeft weer als nadeel wat doe je met formaten die die dll's niet ondersteunen etc.

Ik zou zeggen maak gewoon een class die per formaat een andere functie aanroept maar wel altijd hetzelfde retourneert.

Acties:
  • 0 Henk 'm!

  • Mysteryman
  • Registratie: Februari 2001
  • Laatst online: 19:50

Mysteryman

kan jij wat ik kan...

Ik heb hier ook al een keer tegen wat onderzoek naar gedaan, en dit artikel op codeproject is volgens mij wat je wil...

En anders is het een goede start denk ik ;)

Everybody happy??? I soon change that here we go...


Acties:
  • 0 Henk 'm!

  • beelie
  • Registratie: Maart 2004
  • Laatst online: 20-09 14:12
Het eerste wat in me opkomt is "Strategy Pattern". Dat wordt gebruikt om een implementatie van verschillende algoritmes te gebruiken. Er kan zo at runtime een algoritme gekozen worden.
Een beetje uitleg, weleenswaar in Java, maar de principes blijven hetzelfde.

Misschien ook handig om dit boek eens te bekijken. Het boek is al gigantisch oud (in termen van software), maar wordt nog altijd aanzien als de bijbel in software ontwerp...

Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024

CMG

Kijk eens naar rar.exe dat bij Winrar geleverd wordt. Dat is een console applicatie die je met .startinfo en redirects mooi kan gebruiken om de gewenste informatie op te halen. Ik weet niet of ze alle formaten ondersteunen, maar wel een hoop.

[ Voor 6% gewijzigd door CMG op 02-01-2009 08:15 ]

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
CMG schreef op vrijdag 02 januari 2009 @ 08:15:
Kijk eens naar rar.exe dat bij Winrar geleverd wordt. Dat is een console applicatie die je met .startinfo en redirects mooi kan gebruiken om de gewenste informatie op te halen. Ik weet niet of ze alle formaten ondersteunen, maar wel een hoop.
Yikes, console apps zou ik lekker vandaan blijven als het even kan, dat valt bij mij namelijk niet onder een nette en/of beheersbare manier. Als laatste redmiddel valt het nog te overwegen, maar niet meer dan dat.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 13:03
Gomez12 schreef op vrijdag 02 januari 2009 @ 08:27:
Yikes, console apps zou ik lekker vandaan blijven als het even kan, dat valt bij mij namelijk niet onder een nette en/of beheersbare manier. Als laatste redmiddel valt het nog te overwegen, maar niet meer dan dat.
Meh, Unix en ook Linux zijn er voor een groot gedeelte op gebouwd. Wat lijkt je hier niet beheersbaar aan?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
7-zip heeft een DLL-bestand die ook door programma's als WinRAR gebruikt word, maar waarschijnlijk zit daar enkel ondersteuning voor het 7-zip formaat in? Daar zou je eens naar kunnen kijken.

7-zip is ook via de command-line te bedienen, zo krijg je bijv een lijst van bestanden:
7za l archive.zip

Dan ondersteun je direct alles wat 7-zip lust, en dat is behoorlijk veel :)

Acties:
  • 0 Henk 'm!

Verwijderd

De broncode van 7-zip is beschikbaar onder LGPL licentie, welke geldt voor alle beschikbare formaten behalve RAR. Als ik de code zo zie, is deze vrij makkelijk te gebruiken in je eigen project.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik zou bij 7-zip niet zelf gaan sleutelen, maar gewoon een bestaande interface gebruiken.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

heb je zelf al gezocht naar standaard libraries die inovereenstemming zijn met jouw licentie?

Effe zoeke levert me b.v. http://www.icsharpcode.net/OpenSource/SharpZipLib/ op.

Code searchk (code.google.com, koders.com) ius zeer bruikbaar om libraries te achterhalen.


Zo niet zou je het best per archief formaat kunnen zoeken naar een library/source die het formaat ondersteund en ide in een eigen wrapper maken zoals de personen boven me hebben beschreven.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
farlane schreef op vrijdag 02 januari 2009 @ 09:50:
[...]

Meh, Unix en ook Linux zijn er voor een groot gedeelte op gebouwd. Wat lijkt je hier niet beheersbaar aan?
Het simpele feit dat windows niet met die gedachtengang is opgebouwd en vele windows progs hebben die gedachtengang dus ook niet, simpele vraag : Als je geen filelist terugkrijgt kan je dan op een nette manier een error terugkrijgen?

Acties:
  • 0 Henk 'm!

Verwijderd

Als je meerdere libraries nodig hebt om alle door jou gewenste formaten te ondersteunen dan zou ik voor een oplossing gaan met een interface en adapter classes die deze interface implementeren. De interface definieert methods voor het opvragen van bestandsnaam, bestandsgrootte (uitgepakt/ingepakt) en andere operaties die je op de archieven wil los laten. De adapter classes vertalen the method calls van deze interface naar specifieke method calls van de libraries die de archiefformaat afhandeling regelen. Het voordeel van deze aanpak dat de rest van jouw code geen rekening hoeft te houden of nu met het ene of het andere archiefformaat gebruikt wordt.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 13:03
Gomez12 schreef op vrijdag 02 januari 2009 @ 12:10:
[...]

Het simpele feit dat windows niet met die gedachtengang is opgebouwd en vele windows progs hebben die gedachtengang dus ook niet, simpele vraag : Als je geen filelist terugkrijgt kan je dan op een nette manier een error terugkrijgen?
Het feit dat Windows niet op die manier is opgebouwd is toch geen reden dat het niet beheersbaar zou zijn? ( Volgens mij zijn er genoeg applicaties op Windows die volgens die manier werken, oa 7zip :P ). Normaal gesproken geven console applicaties een errorcode terug, die aangeeft of een actie geslaagd is of niet, of winrar dat doet weet ik niet.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Verwijderd schreef op vrijdag 02 januari 2009 @ 12:24:
Als je meerdere libraries nodig hebt om alle door jou gewenste formaten te ondersteunen dan zou ik voor een oplossing gaan met een interface en adapter classes die deze interface implementeren. De interface definieert methods voor het opvragen van bestandsnaam, bestandsgrootte (uitgepakt/ingepakt) en andere operaties die je op de archieven wil los laten. De adapter classes vertalen the method calls van deze interface naar specifieke method calls van de libraries die de archiefformaat afhandeling regelen. Het voordeel van deze aanpak dat de rest van jouw code geen rekening hoeft te houden of nu met het ene of het andere archiefformaat gebruikt wordt.
Ho. Ik had even niet meer naar dit topic gekeken.

Maar zo ben ik het nu idd gaan doen.

Ik heb tot nu toe Rar en Zip ondersteuning. Voor rar heb ik de UnrarDLL van Rarlab.com gedownload en het C#-project dat daarin staat gebruikt.
En voor zip heb ik SharpZipLib.

Ik loop alleen wel tegen een "probleem" aan, ik moet namelijk op de een of andere manier weten of een archief echt een zip of rar is. Ik heb het nu zo:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    public class Archive
    {
        // Data
        protected List<ArchiveEntry> entries;

        // Constructors
        public Archive()
        {
            this.entries = new List<ArchiveEntry>();
        }

        // Properties
        public List<ArchiveEntry> Entries
        {
            get
            {
                return this.entries;
            }
        }

        // Static methods
        public static Archive FromFile(string path)
        {
            // Check for rar
            try
            {
                Unrar archive = new Unrar(path);
                archive.Open();
                return new ArchiveRar(archive);
            }
            catch { }

            // Check for zip
            try
            {
                ZipFile archive = new ZipFile(path);
                if (archive.TestArchive(false))
                {
                    return new ArchiveZip(archive);
                }
            }
            catch { }

            return null;
        }
    }


Zo heb ik dus een ArchiveRar en ArchiveZip class, die de entries-list vullen met entries uit dat archief (en dat zijn dus ArchiveEntryZip en ArchiveEntryRar objecten, die erven van ArchiveEntry (abstracte class)).

Nu is het grote nadeel dus dat ik altijd voor elke mogelijkheid moet gaan checken. Bij rar is dat in dit geval niet zo'n probleem, omdat dat de eerste check is, maar stel je voor dat ik dadelijk zo'n 20 formaten ondersteun, moet ik 20 checks hebben en als het de allerlaatste is dan duurt het redelijk lang voordat 'ie daar eindelijk achter is.

Ik roep 'm dus voor elke file die ik tegenkom aan:
C#:
1
2
3
4
5
Archive archive = Archive.FromFile("bla.zip");
if (archive != null)
{
    // Dit is echt een archief
}


Ik kan niet simpelweg controleren op extensie, aangezien een bestand gerenamed kan zijn. Bij dit project kan het nogal regelmatig voorkomen dat dat zo is (een .zip die eigenlijk een .7z is bijvoorbeeld). De files vantevoren renamen is niet de bedoeling.

Ik vroeg me dus af of er misschien een andere manier is. Misschien kan ik iets met de eerste X bytes (256 of zo?) van het bestand doen om te bepalen wat voor formaat het is? Maar als die eerste X bytes voldoen, is het dan wel 100% zeker dat het dat formaat is?

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Voor het aantal bytes moet je even zoeken naar een beschrijving van het programmaatje file op linux. Dan heb je ook gelijk de bytes ;)

100% zeker is het natuurlijk niet ( ik kan gewoon een textbestandje laten beginnen met die tekens ). Maar voor normaal gebruik is het minimaal 99,9% afdoende. Wil je meer dan moet je echt elk bestand proberen uit te pakken en te verifieren en als het niet lukt om uit te pakken als zip-bestand dan proberen als rar-bestand etc.

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

l0c4lh0st schreef op vrijdag 02 januari 2009 @ 16:22:
[...]
Ik vroeg me dus af of er misschien een andere manier is. Misschien kan ik iets met de eerste X bytes (256 of zo?) van het bestand doen om te bepalen wat voor formaat het is? Maar als die eerste X bytes voldoen, is het dan wel 100% zeker dat het dat formaat is?
Eerste (4) bytes & extensie geeft een goede hint (niet 100%) wat als eerste te gebruiken. , maar als je het daarmee NIET lukt moet je echt de manier van het betreffende archive gebruiken, en die is complexer. Zeker met sfx files (.exe) waarin een rar of zip zit is dit complexer.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.

Pagina: 1