Mehr

Wie bestimme ich die Version einer SDF-Datei?

Wie bestimme ich die Version einer SDF-Datei?


Ich suche nach einem Tool oder einer Methode, um zuverlässig zu bestimmen, welche SDF-Version eine bestimmte Datei implementiert.

Bisher habe ich den SDF Loader von Autodesk mit dem Flag /info verwendet, aber er unterstützt nur SDFv2.

Leider habe ich eine große Anzahl von SDF-Dateien verschiedener Versionen, bei denen ich feststellen muss, welche auf SDFv3 aktualisiert werden müssen. Da FDO Toolbox nur SDFv3 unterstützt und wir von MapGuide 6.5 aktualisieren, das nur SDFv2 unterstützt.

Zusammenfassend suche ich also nach einer zuverlässigen Möglichkeit, die Haupt- und Nebenversionsnummer der SDF-Datei hoffentlich in einem einzigen Tool zu bestimmen. (Mir ist FME bekannt und lasse es aus Kostengründen als letzten Ausweg)


Wenn Sie versuchen, mit FDO eine Verbindung zu einer SDF < 3.0-Datei herzustellen, gibt der SDF-Anbieter eine Ausnahme mit einer bestimmten Meldung aus (die SDF-Datei scheint Version 2.1 oder älter zu sein. Bitte konvertieren Sie in SDF-Version 3)

Daher ist es eine hässliche, aber praktikable Lösung, die folgende Logik in C# zu verwenden:

try { //Versuchen Sie, eine Verbindung mit FDO herzustellen. Wenn Sie ohne Ausnahmen öffnen/schließen können, handelt es sich um eine gültige SDF3-Datei } catch (OSGeo.FDO.Common.Exception ex) { if (ex.Message == "SDF-Datei scheint Version 2.1 oder älter zu sein. Bitte in SDF-Version konvertieren 3") { //Versuchen Sie es mit dem SDF-Loader. Wenn Sie ohne Fehler öffnen/schließen können, handelt es sich um eine gültige SDFv2-Datei } }

Zusätzlich zu dem, was Jackie sagte:

Auch vom FDO aus können Sie die ersten paar Bytes der SDF-Datei ein wenig überprüfen. Es ist keine Garantie, sollte aber ziemlich zuverlässig sein, insbesondere wenn Sie nur ein Tool zum Erstellen dieser SDF-Dateien verwendet haben. Vielleicht ist dies einfacher, da es ziemlich eigenständig ist (unabhängig von der FDO) und Sie dies in so ziemlich jeder Sprache schreiben können.

Aus dem FDO-Code:

//während wir die Datei geöffnet haben, prüfen Sie, ob es //ein älteres SDF (2.1 oder älter) ist, indem Sie die ersten paar Bytes lesen. // all dies geschieht in Little-Endian. vorzeichenloser langer Wert; fread(&value, sizeof(unsigned long), 1, f); fclose(f); if((value & 0x0000ffff) == 0x00002c00) { // 2.x-Versionen // Könnte auch 1.0 enthalten, aber es ist nicht //garantiert, dass es altes SDF ist, da andere Binärdateien // die gleichen Anfangsbytes haben können // Beachten Sie, dass die ersten 4 DWORDS für SDF3-Dateien (SQLite) lauten: //value[0] == 0x00000000 //value[1] == 0x00000001 //value[2] == 0x00000000 //value[3] == 0x00053162 //Aber der richtige Weg, um die Version von nun an zu überprüfen, ist //die Schema-Datenbank zu öffnen und die Versionsnummer zu lesen, was wir später in dieser Funktion // tun. Wurf… }

FDO v3.6.0: OpenSource_FDO/Providers/SDF/Src/Provider/SdfConnection.cpp Zeile: 285


Sie können die ersten Bytes der Datei überprüfen. Wenn sie "SQLITE" enthalten, haben Sie es mit v3 zu tun.