Giriş
Metadata ifadesinin tanımına baktığımızda “veri hakkında veri” diye bir kavram ile karşılaşırız. En basit örneği ile MP3
dosyalarımızda dinlediğimiz müziğin ses bilgilerinin yanı sıra sanatçı,
parça ismi, yapım yılı gibi bilgilerininde ID3 formatında bulunmasıdır.
Bu bilgiler MP3
dosyalarının son 128 bitinde yer alır. Başka bir örnekte dijital
fotoğraf makinesi ile çekilen fotoğraf belgelerinde bulunan EXIF
bilgileridir. Buda çekilen fotoğrafın tarihi, makinenin markası ve
ışık, pozlama gibi fotoğrafçılık ile ilgili bilgilerin aynı dosyada
barındırılmasını sağlar. Bütün bu bilgilerini saklanma sebebi herhangi
bir arama işleminde ulaşılacak veri hakkında özet verilere ulaşmaktır.
Günümüzde arama motorlarının önem kazanması ve bu konuda yapılan arge
çalışmaları ve yatırımların artmasıda ulaşılmak istenen verinin daha
kısa zamanda bulunması içindir.
Google ve MSN arama motorlarının Desktop versiyonları temelde IFilter
arayüzü ile sistemimizdeki tüm dosyaları indeksler. [1] Bunun için
yazılım firmaları kendi ürünleri için bir IFilter arayüzünü programlar.
Microsoft Office’i kurduğunuzda bu sisteminizde otomatik kurulurken PDF dökümanları için Adobe firmasının sitesininden IFilter arayüzünü indirip kurmanız gerekmektedir. [2]
Bazı komponent firmaları ise JPEG [3] ve Audio Video [4] formları için ücretli IFilter arayüzleri oluşturlardır.
Tüm bu IFilter arayüzlerinin temeli ise Object Linking and Embed
teknolojisi altındaki IpropertyStorage arayüzünün kullanılması ile
bağlantılıdır. [5] Buda bir programcı için Win32 sistem kaynaklarının
kullanımının zorluğu demektirki her yazılım firmasının kendi IFilter
arayüzünü yazması için bir sebeptir.
Microsoft, Office belgelerindeki bu metadata’ların programcı tarafından
okunması ve değiştirilebilmesi için “Microsoft Developer Support OLE File Property Reader 2.0” ismi altında C++ ile geliştirdiği bir COM komponentini geliştirmiş. [6]
Herhangi bir Office belgesinin üzerine sağ tıklayıp özelliklerine girdiğimizde aşağıdaki gibi özet bilgilere ulaşabiliriz :
Buradaki bilgilerden bazılarını değiştirebilirken bazılarıda salt okunurdur.
1. Senaryo
Bir kitabevi yabancı dilden çevirdiği eserler için çeviri yapan kişiye
kelime başına bedel ödemektedir. Aysonu geldiğinde içinde bulundukları
ay boyunca yapılan tüm çeviler hesaplanıp ödeme planı çıkarılmaktadır.
Buna ek olarak yapılan çevirilerin karakter sayıları, boşluklarla
birlikte karakter sayıları, sayfa sayıları ve kelime sayıları
istatistiki bilgi olarak tutulmaktadır. Çeviri bedellerini hesaplayan
şahıs zaman zaman word belgelerinde bulunan Author özelliğinde
düzenleme yapabilmelidir.
2. Çözüm
Kullanıcının kendi dosyaları arasında rahatça dolaşabilmesi için
Form’umuza bir adet TreeView kontrolü ekledim. Ve Form’un Load ve
TreeView’ın AfterSelect event’larına gerekli kodları yazdım.
Makalenin örnek projesinde detaylarını inceleyebilirsiniz. Biz asıl konumuza odaklanalım.
2.1 Okuma
Herhangi bir word dosyası seçildiğinde
DSOFile.OleDocumentPropertiesClass namsespace’indeki class’ın bir instance’ını oluşturuyoruz :
DSOFile.OleDocumentPropertiesClass odp = new DSOFile.OleDocumentPropertiesClass();
Daha sonra Open metodu ile ilgili dosyayı açmamız gerekiyor. Open metodu üç parametre almaktadır :
void OleDocumentPropertiesClass.Open(
string fileName,
bool ReadOnly,
DSOFile.dsoFileOpenOptions Options
);
fileName : Bilgileri okunacak dosyanın yolu.
ReadOnly : True ise açılan dosya bilgileri değiştirilemez. False ise değiştirilebilir.
Options : DSOFile içinde bulunan enum tipinde değişkendir. Alabileceği değerler
• dsoOptionDefault
• dsoOptionDontAutoCreate
• dsoOptionOnlyOpenOLEFiles
• dsoOptionOpenReadOnlyIfNoWriteAccess
• dsoOptionUseMBCStringsForNewSets
Artık dosyamızı bilgi okumak için açıyoruz :
odp.Open(fileInfo.FullName, true, DSOFile.dsoFileOpenOptions.dsoOptionDefault);
Bundan sonra ihtiyacımız olan verileri odp objesinden okuyabiliriz.
string author = odp.SummaryProperties.Author;
int characterCount = odp.SummaryProperties.CharacterCount;
int characterCountWithSpaces = odp.SummaryProperties.CharacterCountWithSpaces;
int pageCount = odp.SummaryProperties.PageCount;
int wordCount = odp.SummaryProperties.WordCount;
İşimiz bittikten sonra objemizi Close metodu ile kapatabiliriz. Close metodu ise bir parametre almaktadır.
void OleDocumentPropertiesClass(bool SaveBeforeClose)
SaveBeforeClose : True ise yapılan değişiklikleri kaydeder ve kapatır, false ise kaydetmeden kapatır.
Herhangi bir değişiklik yapmadığımız için false değeri ile close metodunu çalıştırıyoruz:
odp.Close(false);
2.2 Yazma
Save butonu altında yaptığımız tek değişiklik Author kısmıdır bu yüzden
benzer sadece Author özelliğini değiştirip nesnemizi kapatırken true
değerini vereceğiz.
DSOFile.OleDocumentPropertiesClass odp = new DSOFile.OleDocumentPropertiesClass();
odp.Open(fileInfo.FullName, false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);
odp.SummaryProperties.Author = txtAuthor.Text;
odp.Close(true);