COPYFILE ve FILELIST hangi problemi çözer
Bir entegrasyon senaryosunda sıkça karşılaşılan iş: bir klasördeki dosyaları tarayıp, belirli kritere uyanları başka bir konuma kopyalamak — örneğin işlenmiş EDI dosyalarını bir "processed" klasörüne taşımak. TROIA'da bunun için harici bir dosya sistemi kütüphanesi gerekmiyor; FILELIST ile klasör içeriğini bir tabloya döküp, COPYFILE ile taşıma/kopyalama işlemini yapıyorsunuz.
Sözdizimi
Klasör listeleme:
FILELIST {klasoryolu} TO {hedeftablo};
Klasör yoksa RETURNVALUE alanına 'notexist' değeri düşer — bu kontrolü atlamak, "tablo boş geldi ama aslında klasör hiç yoktu" tarzı sessiz hataların en yaygın kaynağıdır.
Dosya kopyalama:
COPYFILE {kaynakyolu} INTO {hedefyolu};
Varlık kontrolü ve silme:
FILEEXISTS {dosyayolu};
/* SYS_STATUS: 1 = yok, 0 = var */
DELETEFILE {dosyayolu};
Gerçek bir örnek: işlenmiş dosyaları arşive taşımak
/* Gelen klasöründeki .xml dosyalarını okur, işlenmiş klasöre kopyalar, orijinalini siler. */
LOCAL:
TABLE GELENLER(ADI CHAR(200));
STRING KAYNAK;
STRING HEDEF;
FILELIST '*C:\Entegrasyon\Gelen' TO GELENLER;
IF RETURNVALUE = 'notexist' THEN
MESSAGE 'Gelen klasörü bulunamadı.' TYPE ERROR;
RETURN;
ENDIF;
LOOP AT GELENLER;
IF GELENLER.ADI LIKE '%.xml' THEN
KAYNAK = '*C:\Entegrasyon\Gelen\' + GELENLER.ADI;
HEDEF = '*C:\Entegrasyon\Islenmis\' + GELENLER.ADI;
COPYFILE KAYNAK INTO HEDEF;
DELETEFILE KAYNAK;
ENDIF;
ENDLOOP;
FILELIST'in döndürdüğü tablo neye benzer
FILELIST, hedef tabloya en azından dosya adını doldurur; bazı ortamlarda dosya boyutu ve değişiklik tarihi gibi ek kolonlar da gelebilir (sürüme göre değişebildiği için, kullanmadan önce DEVT01 veritabanı tarayıcı transaction'ında ya da DEVT30 Runcode ile hedef tablonun yapısını bir kez test etmek zaman kazandırır).
Sık yapılan hatalar
LIKEdeseninde büyük/küçük harf duyarlılığı — dosya sisteminin kendisi büyük/küçük harf duyarlı olmasa da, TROIA'nın string karşılaştırmaları öyle olabilir;.XMLuzantılı dosyaların atlandığını fark etmeden önce bunu test edin.- Kopyalama sonrası silmeyi tek bir "atomik" adım sanmak —
COPYFILEveDELETEFILEiki ayrı komuttur; aradaki milisaniyelerde process kesilirse (application server yeniden başlarsa) dosya hem kaynakta hem hedefte kalabilir ya da hiçbirinde kalmayabilir. Kritik entegrasyonlarda kopyalama başarılı olduğunu (FILEEXISTSile hedefte) doğrulamadan kaynağı silmemek daha güvenli. - Döngü içinde binlerce dosyayı tek tek kopyalamak — çok büyük klasörlerde bu işlem application server'ı bir süreliğine meşgul eder; kullanıcı arayüzünü bloke etmemek için bu tür toplu işleri senkron bir buton yerine bir batch transaction'a taşımak daha sağlıklı.
- Hedef klasörün var olduğunu varsaymak —
COPYFILE,UNZIPFILE'ın aksine genelde ara klasörleri kendiliğinden oluşturmaz; hedef yol yapısının önceden hazır olduğundan emin olun.
Sıradaki adım
OPEN FILE, PUT, GET ve GETBLOCK ile satır satır ya da blok blok dosya okuma-yazma konusuna bir sonraki yazıda değineceğim — COPYFILE'ın "dosyayı olduğu gibi taşı" senaryosundan farklı olarak, bu sefer dosyanın içeriğiyle satır satır çalışacağız.
Yorumlar (0)
Yorum Yaz