Wie erhalte ich Dateien in meinem eigenen Dateiformat ein eigenes Dynamik Symbol haben?

StackOverflow https://stackoverflow.com/questions/120865

  •  02-07-2019
  •  | 
  •  

Frage

Unsere Anwendung hat ein Dateiformat ähnlich das Opendocument-Dateiformat (siehe http: //en.wikipedia. org / wiki / OpenDocument- .) - dh mit einer Manifest-Datei, ein Miniaturbild Reißverschluss, etc.

Ich stelle fest, dass Openoffice-Dateien ein Vorschaubild der Open Office-Datei als ihre Symbole, sowohl unter Windows und unter Linux. Gibt es eine Möglichkeit, dies für unsere Dateien zu erreichen: das heißt ich will ein dynamisches Symbol auf der Grundlage der internen thumbnail.png

Bearbeiten 1 Wow, vielen Dank für die schnellen Antworten. Thumbnailer sieht gut aus für die GNOME-Welt. Windows Ich werde in diese Links suchen, danke. Wie für den Kommentar Frage:. Programmatisch oder über unser Installationsprogramm

Edit 2 Oh, vergessen Mac. Wie wäre es auf dem Mac? (Leider Mac-Liebhaber!) Auch gibt es irgendwelche Links oder Informationen, wie Openoffice tut ihre IconHandler Sachen - da wir sehr ähnlich sein würden

War es hilfreich?

Lösung

Fenster

Was Sie brauchen, ist ein Icon Handler , die auch als Thumbnail Handler bekannt. Hier ist ein Beispiel geschrieben als aktiv x Kontrolle .

Eine weitere Ressource ist a href nachschlagen <= "http://blogs.msdn.com/benkaras/archive/2007/01/21/what-do-property-handlers-accomplish.aspx" rel = "nofollow noreferrer "> Property Handlers , die auch auf den neuesten und besten Weg zeigen sollten dynamische Metadaten mit korrekt in Windows behandelt.

Dies sind dynamische Lösungen - sie nicht benötigt werden, wenn Sie nur ein Symbol wollen mit allen Dateien verknüpft - sie nur verwendet werden, wenn Sie Windows-Explorer ein Symbol angezeigt werden auf das, was in der ist Datei, nicht nur die Erweiterung, und wenn die Datei das Symbol ändert aktualisiert, um die Änderungen widerzuspiegeln. Es muss nicht ein Bild der Datei selbst, entweder können die Thumbnail-Handler jedes Bild erzeugen, basierend auf dem Inhalt der Datei.

Die Eigenschaft Handler aktualisiert andere Metadaten wie Titel oder Video Länge, so dass Sie alle Metadaten verwenden können Windows Explorer unterstützt.

In Bezug auf MAC-Unterstützung, diese Seite sagt: „Der Mac und Windows-Betriebssysteme haben verschiedene Methoden der Verwendung dieser Art von Miniatur ermöglicht, und im Fall des Mac OS, diese Unterstützung hat sich von Version zu Version inkonsistent so ist es nicht [für Adobe InDesign] verfolgt. "

OS X

Icons für Mac OSX werden von der Services-Datenbank starten . Es ist jedoch für alle Dateien auf ein statisches Symboldatei verweist von einer registrierten Anwendung behandelt (es ist nicht auf Erweiterung basiert - jede Datei Meta-Daten angehängt hat, dass die Anwendung bestimmt, zu dem es gehört, obwohl Erweiterungen Hinweise geben, wenn die Meta-Daten nicht existieren, wie die Datei von einem anderen Betriebssystem oder Dateisystem)

bekommen

Es scheint, dass die dynamische Symbol Funktionalität in OSX von Finder zur Verfügung gestellt, sondern suchen bringt keine einfachen Hinweise in dieser Richtung nach oben. Da Finder hält im Laufe der Zeit ändern, kann ich sehen, warum dieses Ziel nur schwer zu schlagen ...

Gnome

Für Gnome verwenden Sie ein thumbnailer . (Danke Dorward )

Dies ist ein außerordentlich einfaches Programm, das Sie schreiben, die 3 Kommandozeilenparameter hat:

  • Eingabedateiname, die Datei, die Sie mit der Miniatur beschreiben (oder URI, wenn Sie diejenigen stattdessen annehmen)
  • Ausgabedateinamen, in dem Sie müssen die PNG
  • schreiben
  • Größe, eine Zahl in Pixeln, das beschreibt die maximale Größe quadratische Bildes Sie produzieren sollen (128 -> 128x128 oder kleiner)

Ich wünsche alle Systeme so einfach waren. Auf der anderen Seite unterstützt dies nicht Animation und ein paar andere Features, die von schwieriger zu implementieren Plugins auf anderen Systemen zur Verfügung gestellt werden.

KDE

Ich bin ein wenig unsicher, aber es gibt ein paar Hinweise, die Ihnen den Einstieg erhalten sollen. Erste ist, dass Konqueror der Dateimanager und zeigt die Symbole - es unterstützt die dynamische Symbole für einige integrierte Typen, aber ich weiß nicht, ob diese fest einprogrammiert sind, oder Plugins, die Sie schreiben können. Schauen Sie sich die Embedded Komponenten Tutorial für einen Ausgangspunkt.

Es gibt eine neue (ish?) Funktion (oder geplante Funktion ...) Aufrufed Plasma, die ein sehr viel mit Symbolen und Symbol Funktionalität zu tun. Check out diese announcment und diese anfängliche Implementierung .

Sie müssen möglicherweise in die Quelle von Konqueror graben und überprüfen, wie sie dies für Textdateien und andere haben bereits umgesetzt.

-Adam

Andere Tipps

Mac OSX ab Version 10.5 ...

... hat zwei Ansätze:

  1. Ihr Dokument ist in dem Standard-OSX-Bundle-Format und verfügt über ein statisches Bild Dies kann durch Erstellen eines Unterordners Info und Platzieren der Thumbnail / Preview.png / tiff / jpg innen erfolgen.

  2. Alles anderes braucht einen Info Generator Plugin, das entweder in / Library / Quicklook ~ / Library / Quicklook oder im YourApp.app/Contents/Library/QuickLook Ordner gespeichert werden kann.

Dieser Generator verwendet wird, Thumbnails und Vorschauen Info on the fly zu erstellen. XCode bietet eine Vorlage für diese. Die Vorlage erzeugt die benötigten ANSI C Dateien, die umgesetzt werden müssen. Wenn Sie schreiben wollen Objekt-C Code müssen Sie die GenerateThumbnailForURL umbenennen. c und GeneratePreviewForURL. c zu GenerateThumbnailForURL. m und GeneratePreviewForURL m (und den Apple-Devel Docs sorgfältig lesen;)).


Einfache Zip-Container basierte Demo:

Du musst die Cocoa.framework und Foundation.framework zu einem Projekt hinzuzufügen In Ihrem GenerateThumbnailForURL.c (dies ist zum Teil aus meinem Kopf - so keine Garantie, dass es aus der Box funktioniert;)):

#include <Cocoa/Cocoa.h>
#include <Foundation/Foundation.h>

OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize)
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  /* unzip the thumbnail and put it into an NSData object */
  // Create temporary path and writing handle for extraction
  NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingFormat: [NSString stringWithFormat: @"%.0f.%@" , [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"png"]];
  [[NSFileManager defaultManager] createFileAtPath: tmpPath contents: [NSData alloc] attributes:nil];
  NSFileHandle *writingHandle = [NSFileHandle fileHandleForWritingAtPath: tmpPath];


  // Use task to unzip - create command: /usr/bin/unzip -p <pathToFile> <fileToExtract>
  NSTask *unzipTask = [[NSTask alloc] init];
  [unzipTask setLaunchPath: @"/usr/bin/unzip"];

  // -p -> output to StandardOut, added File to extract, nil to terminate Array
  [unzipTask setArguments: [NSArray arrayWithObjects: @"-p", [(NSURL *) url path], @"Thumbnails/thumbnail.png", nil]];

  // redirect standardOut to writingHandle
  [unzipTask setStandardOutput: writingHandle];

  // Unzip - run task
  [unzipTask launch];
  [unzipTask waitUntilExit];

  // Read Image Data and remove File
  NSData *thumbnailData = [NSData dataWithContentsOfFile: tmpPath];
  [[NSFileManager defaultManager] removeFileAtPath: tmpPath handler:nil];


  if ( thumbnailData == nil || [thumbnailData length] == 0 ) {
     // Nothing Found. Don't care.
     [pool release];
     return noErr;
  }

  // That is the Size our image should have - create a dictionary too
  CGSize size = CGSizeMake(256, 256);
  NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
      [NSNumber numberWithInt:size.width],kQLPreviewPropertyWidthKey,
      [NSNumber numberWithInt:size.height],kQLPreviewPropertyHeightKey,
      nil];

  // Get CGContext for Thumbnail
  CGContextRef CGContext = QLThumbnailRequestCreateContext(thumbnail, size, TRUE, (CFDictionaryRef)properties);
  if(CGContext) {
     NSGraphicsContext* context = [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)CGContext flipped:size.width > size.height];
     if(context) {
        //These two lines of code are just good safe programming…
       [NSGraphicsContext saveGraphicsState];
       [NSGraphicsContext setCurrentContext:context];

       NSBitmapImageRep *thumbnailBitmap = [NSBitmapImageRep imageRepWithData:thumbnailData];
       [thumbnailBitmap draw];

       //This line sets the context back to what it was when we're done
       [NSGraphicsContext restoreGraphicsState];
    }

    // When we are done with our drawing code QLThumbnailRequestFlushContext() is called to flush the context
    QLThumbnailRequestFlushContext(thumbnail, CGContext);

    // Release the CGContext
    CFRelease(CGContext);
  }

  [pool release];
  return noErr;
}

Info.plist

In Kürze erhalten Sie haben Ihre info.plist Datei ändern - wenn Sie es öffnen es viele Felder voreingestellt hat. Die meisten von ihnen sind selbst explaning (oder nicht geändert werden müssen), aber ich hatte die folgende Struktur hinzufügen (kopieren und einfügen tun soll - kopieren Sie den Text, den plist Editor gehen und einfach einfügen.):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
   <dict>
     <key>UTTypeConformsTo</key>
     <array>
       <string>com.pkware.zip-archive</string>
     </array>
     <key>UTTypeDescription</key>
     <string>i-net Crystal-Clear Report File</string>
     <key>UTTypeIconName</key>
     <string>generic</string>
     <key>UTTypeIdentifier</key>
     <string>com.company.product</string>
     <key>UTTypeReferenceURL</key>
     <string>http://your-url.com</string>
     <key>UTTypeTagSpecification</key>
     <dict>
       <key>public.filename-extension</key>
         <array>
           <string>$fileEXT$</string>
         </array>
     </dict>
  </dict>
</array>
</plist>

Dies wird Ihre Datei des Typs $ FileExt $ registrieren und das System sagen, dass Ihr Dateityp ein Zipy Formattyp ist. Ein schöner refference, die ich verwendet, hier ist die Info IPA Plugin von Google

In Windows, was Sie brauchen, ist ein Symbol Handler zu implementieren. Ich tat dies vor vielen Monden und es ist nicht schwierig, solange Sie die Grundlagen der COM kennen.

Siehe auch: http://msdn.microsoft. com / en-us / library / bb776857 (VS.85) aspx

Für Gnome verwenden Sie ein thumbnailer .

Dies ist bis zu dem Betriebssystem, soweit ich weiß, wird es auf der Dateierweiterung basiert.

für WINDOWS versuchen Sie dies:

http://www.easydesksoftware.com/news/news12.htm

Executables hat das Symbol in der Datei (möglicherweise mehr) als „Ressource“.

Datendateien wählen Sie ein Symbol basierend auf Dateizuordnung auf.

Wenn Sie eine benutzerdefinierte Symbol pro Datei möchten, die viel schwieriger ist. Sie müssen entweder das Betriebssystem zu täuschen zu denken, es eine ausführbare Datei ist und betten das Symbol als Ressource in der Datei oder Deep-Link in das Betriebssystem die Standardsymbol Auswahlroutine außer Kraft zu setzen.

Ich denke, "custom eigenes" Symbol nur PE-Dateien in Windows hat. Alle anderen Symbole für Dateierweiterungen werden in Windows-Registry gespeichert.

Zur Festlegung von PE-Datei, können Sie sich unter einem eingehenden Blick Portable Executable File Format in die Win32 und Peering im Inneren des PE: A Tour des Win32 Portable Executable File Format .

Wie es in anderen OS funktioniert, weiß ich nicht. /

Ich weiß nicht, über Linux, aber für Windows können Sie beginnen hier: http://msdn.microsoft.com/en-us/library/bb774614. aspx

Edit: Ich denke, diese Schnittstelle für die Thumbnails ist in Miniaturansicht gezeigt, keine Symbole. Es tut uns Ihre Zeit verschwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top