Ne zaman dosya sıkıştırmaya ihtiyaç duyarsınız

CANIAS projelerinde ZIPFILE/UNZIPFILE komutlarıyla en sık karşılaştığım iki senaryo var: bir raporun onlarca ekini tek dosyada toplayıp e-posta ile göndermek, ve bir entegrasyon dosyasını (örneğin toplu XML/CSV aktarımı) sıkıştırılmış halde bir FTP sunucusuna yüklemek. TROIA bu işi harici bir kütüphaneye ihtiyaç duymadan, iki komutla hallediyor.

ZIPFILE ve UNZIPFILE sözdizimi

Sıkıştırma:

ZIPFILE {dosyayolu} INTO {hedefzipdosyasi};

Birden fazla dosyayı tek seferde sıkıştırmak için yollar | karakteriyle birleştiriliyor: 'C:\TMP\rapor1.pdf|C:\TMP\rapor2.pdf'.

Açma:

UNZIPFILE {zipdosyayolu} INTO {hedefklasor};

Gerçek bir örnek: aylık raporları paketleyip FTP'ye yollamak

/* Bir klasördeki tüm raporları sıkıştırıp arşiv adıyla FTP'ye yükler. */
LOCAL:
    STRING KAYNAKLIST;
    STRING ZIPYOLU;
    TABLE DOSYALAR(ADI CHAR(200));

FILELIST '*C:\TMP\raporlar' TO DOSYALAR;

IF RETURNVALUE = 'notexist' THEN
    MESSAGE 'Kaynak klasör bulunamadı.' TYPE ERROR;
    RETURN;
ENDIF;

LOOP AT DOSYALAR;
    IF KAYNAKLIST = '' THEN
        KAYNAKLIST = '*C:\TMP\raporlar\' + DOSYALAR.ADI;
    ELSE
        KAYNAKLIST = KAYNAKLIST + '|' + '*C:\TMP\raporlar\' + DOSYALAR.ADI;
    ENDIF;
ENDLOOP;

ZIPYOLU = '*C:\TMP\raporlar_' + SYS_DATE8 + '.zip';
ZIPFILE KAYNAKLIST INTO ZIPYOLU;

Pratik notlar ve tuzaklar

  • Yol öneki * unutulursa istemci/sunucu karışıklığı olur. FILELIST, ZIPFILE gibi komutlarda * ile başlayan yollar istemci makinesindeki dosyayı işaret eder; önek yoksa sunucu tarafındaki bir yol aranır. Server'da hiç var olmayan bir dosya için "dosya bulunamadı" hatası aldığınızda ilk kontrol edilecek şey genelde bu önektir.
  • Boş klasörü sıkıştırmaya çalışmak sessizce başarısız olabilir — ZIPFILE çağrısından önce FILELIST ile en az bir dosya olduğunu doğrulamak, üretimde "boş zip dosyası" şikayetlerini önler.
  • UNZIPFILE hedef klasörü otomatik oluşturmaz — hedef klasörün önceden var olduğundan emin olun, aksi halde açma işlemi sessizce ya da hata ile başarısız olabilir; bu yüzden UNZIPFILE çağrısından önce klasörün varlığını FILEEXISTS benzeri bir kontrolle doğrulamak iyi bir alışkanlık.
  • Büyük dosyalarda sıkıştırma application server'ın CPU'sunu kullanır — bu işlem istemci tarafında değil sunucuda çalıştığı için, çok sayıda kullanıcı aynı anda büyük arşivler oluşturuyorsa sunucu performansını gözlemlemek gerekir; toplu/batch işler için mümkünse gece saatlerine planlanmış bir transaction tercih edin.

Sıradaki adım

Bir sonraki yazıda aynı dosya komutları ailesinden COPYFILE ve FILELIST ile dosya kopyalama/listeleme senaryolarına, ardından OPEN FILE/PUT/GET ile satır satır dosya okuma-yazmaya değineceğim.