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

  • LIKE deseninde 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; .XML uzantılı dosyaların atlandığını fark etmeden önce bunu test edin.
  • Kopyalama sonrası silmeyi tek bir "atomik" adım sanmak — COPYFILE ve DELETEFILE iki 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 (FILEEXISTS ile 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.