ertin
Üye
-
Konu Sahibi
-
Python ile Zip oluşturma
Elimde böyle bir doküman vardı Gemini ile düzenleyip size aktarayım dedim
HandyZip, Xplore ile bunu yapma imkanın zaten var.
Uygulamayı açıp Ayarlar bölümüne gir ve "Alt klasörleri ekle" seçeneğini "Evet" olarak ayarla; hepsi bu. Değiştireceğin dosya bir klasörün içindeyse yine aynı klasör yapısında kalacaktır.
Hâlâ sorun yaşıyorsan alternatif yol:
Belki program içinde kullanmak istersin diye PyS60 için kodları da paylaşıyorum.
a = zipfile.ZipFile("C:\\x.zip", "r")
for i in a.namelist():
b = open("E:\\" + i, "wb")
b.write(a.read(i))
b.close()
a.close()
Yeni bir ZIP arşivi oluştururken "w" (write) modunu kullanıyoruz:
import zipfile
def Zip(yol, isim):
com = zipfile.ZIP_DEFLATED
zip = zipfile.ZipFile("E:/" + isim + ".zip", "w", com)
zip.write(yol, isim)
zip.close()
Mevcut bir arşive dosya eklemek istiyorsan modu "a" (append) yapman gerekir:
import zipfile
# Türkçe karakter desteği için decode('utf-8') kullanıyoruz
zip_yolu = "E:\\sıkıştırılmış dosya.zip".decode("utf-8")
def Zip(yol, isim):
com = zipfile.ZIP_DEFLATED
zip = zipfile.ZipFile(zip_yolu, 'a', com)
zip.write(yol, isim)
zip.close()
Tek satırlık alternatif (kısa kod arayanlar için):
import zipfile
zipfile.ZipFile("E:\\sıkıştırılmış dosya.zip".decode("utf-8"), 'a', zipfile.ZIP_DEFLATED).write(yol, isim)
(Tek satırda çözüyor ama pratiklik açısından fonksiyon olarak tutmak daha sağlıklıdır.)
Eğer doğrudan hazır bir program arıyorsan, geliştirmeye devam ettiğim "Dosya Kontrol" uygulamasını paylaşabilirim. ZIP modülüne eklemeyi düşündüğüm başka özellikler de var ancak senin istediğin (mevcut ZIP içine dosya ekleme) fonksiyonu şu an çalışıyor.
Symbian, PyS60 ve mobil arşivleme dünyasına dair cevaba eklenebilecek teknik detaylar, nostaljik sırlar ve püf noktaları:
HandyZip, Xplore ile bunu yapma imkanın zaten var.
Uygulamayı açıp Ayarlar bölümüne gir ve "Alt klasörleri ekle" seçeneğini "Evet" olarak ayarla; hepsi bu. Değiştireceğin dosya bir klasörün içindeyse yine aynı klasör yapısında kalacaktır.
Hâlâ sorun yaşıyorsan alternatif yol:
- Klasörü tamamen dışarı çıkart.
- Dosya yöneticisiyle istediğin dosyayı değiştir.
- Klasörü tekrar ZIP içine ekle, işlem tamamdır.
Belki program içinde kullanmak istersin diye PyS60 için kodları da paylaşıyorum.
1. ZIP Dosyasını Dışarı Çıkarmak İçin:
import zipfilea = zipfile.ZipFile("C:\\x.zip", "r")
for i in a.namelist():
b = open("E:\\" + i, "wb")
b.write(a.read(i))
b.close()
a.close()
2. Sıfırdan Yeni ZIP Oluşturmak İçin:
Yeni bir ZIP arşivi oluştururken "w" (write) modunu kullanıyoruz:
import zipfile
def Zip(yol, isim):
com = zipfile.ZIP_DEFLATED
zip = zipfile.ZipFile("E:/" + isim + ".zip", "w", com)
zip.write(yol, isim)
zip.close()
3. Var Olan ZIP İçine Dosya Eklemek İçin:
Mevcut bir arşive dosya eklemek istiyorsan modu "a" (append) yapman gerekir:
import zipfile
# Türkçe karakter desteği için decode('utf-8') kullanıyoruz
zip_yolu = "E:\\sıkıştırılmış dosya.zip".decode("utf-8")
def Zip(yol, isim):
com = zipfile.ZIP_DEFLATED
zip = zipfile.ZipFile(zip_yolu, 'a', com)
zip.write(yol, isim)
zip.close()
Tek satırlık alternatif (kısa kod arayanlar için):
import zipfile
zipfile.ZipFile("E:\\sıkıştırılmış dosya.zip".decode("utf-8"), 'a', zipfile.ZIP_DEFLATED).write(yol, isim)
(Tek satırda çözüyor ama pratiklik açısından fonksiyon olarak tutmak daha sağlıklıdır.)
Eğer doğrudan hazır bir program arıyorsan, geliştirmeye devam ettiğim "Dosya Kontrol" uygulamasını paylaşabilirim. ZIP modülüne eklemeyi düşündüğüm başka özellikler de var ancak senin istediğin (mevcut ZIP içine dosya ekleme) fonksiyonu şu an çalışıyor.
Mesaj birleştirildi:
Symbian, PyS60 ve mobil arşivleme dünyasına dair cevaba eklenebilecek teknik detaylar, nostaljik sırlar ve püf noktaları:
20 Bonus Bilgi
- appuifw ile İlerleme Çubuğu: Büyük ZIP dosyalarını çıkartırken telefonun donmuş gibi görünmemesi için appuifw.app.body üzerinde bir ProgressBar veya appuifw.note(u"Çıkartılıyor...", "info") kullanmak kullanıcı deneyimini kurtarır.
- zlib Modülü Zorunluluğu: zipfile.ZIP_DEFLATED sıkıştırma algoritmasının çalışabilmesi için PyS60 kurulumunda zlib.pyd dosyasının (C:\system\libs\ veya E:\system\libs\) yüklü olması şarttır; aksi takdirde betik RuntimeError fırlatır.
- RAM Sınırları ve Büyük Dosyalar: a.read(i) tüm dosya içeriğini doğrudan RAM'e yükler. 8 MB veya 16 MB boş RAM'e sahip eski S60 cihazlarda (örn. 6600, 7650) büyük dosyalar MemoryError ile çökmeye yol açar.
- Parça Parça Yazma (Chunking): Bellek yetersizliğini aşmak için zipfile akışını (stream) döngü içinde 1 KB veya 4 KB'lık parçalar (chunk) halinde okuyup diske yazmak cihazı rahatlatır.
- Önbellek Temizliği (gc.collect(
Döngü bittikten hemen sonra import gc; gc.collect() çağırmak, Symbian'ın yetersiz çöp toplayıcısına bellek bloklarını hemen iade etmesini sağlar. - Dosya İzinleri (Read-Only): Çıkartılan dosya daha önce salt okunur (read-only) olarak arşivlenmişse, hedef dizinde üzerine yazma denemeleri Symbian hata kodu KErrAccessDenied (-21) döndürür.
- Sürücü Kontrolü: E:\ (hafıza kartı) takılı değilken doğrudan yazmaya çalışmak betiğin kilitlenmesine neden olur; öncesinde e32.drive_list() ile sürücünün varlığı doğrulanmalıdır.
- Zaman Damgaları (Timestamps): zipfile varsayılan olarak çıkartılan dosyaların orijinal oluşturulma/değiştirilme tarihlerini korumaz; bunu korumak için info.date_time verisini okuyup Symbian dosya özelliklerine işletmek gerekir.
- S60v2 ve S60v3 Yol Ayrımı: S60v2'de C:\system\apps\ altına serbestçe dosya yazılabilirken, S60v3'te "Platform Security" nedeniyle bu dizinler korumalıdır.
- Batarya Tüketimi Uyarısı: Yoğun ZIP_DEFLATED işlemleri ARM işlemciyi %100 yükte tutar; uzun arşivlemeler bataryayı normalden 4-5 kat daha hızlı tüketir.
- Geri Plan Işığı Kilidi: Arşivleme sırasında ekran kapanıp cihaz uyku moduna geçmesin diye e32.reset_inactivity() döngü içine eklenmelidir.
- Türkçe Karakter Sınırı: PyS60 1.4.5 sürümünde dosya adlarında decode('utf-8') yerine bazen Windows-1254 (CP1254) karakter tablosunu decode('cp1254') olarak eşlemek Türkçe dosya isimlerinde çökmeyi engeller.
- Geçici Dosya Çöpü: Append ('a') modu çalışırken elektrik kesilirse (batarya çıkarsa), ZIP dosyası bozulabilir (BadZipfile); işlem öncesi .bak kopyası almak en güvenli yoldur.
- Şifreli ZIP Dosyaları: PyS60'taki yerleşik zipfile, standart ZipCrypto şifrelerini çözebilir (pwd parametresiyle), ancak modern AES-256 şifreli arşivleri desteklemez.
- Klasör Belirteci: Arşiv içindeki bir girdinin klasör olup olmadığını anlamanın en hafif yolu i.endswith('/') kontrolüdür.
- os.stat Boyut Doğrulaması: Dosya ZIP içine yazılmadan önce os.path.getsize() ile dosyanın 0 bayt olup olmadığı kontrol edilmelidir.
- Dosya Kilitleme: Başka bir arka plan uygulamasının açık tuttuğu sistem dosyaları (örn. açık bir .log veya .ini) arşive eklenirken IOError: Permission denied hatası verir.
- Maksimum Dosya Boyutu: FAT16 kullanan MMC kartlarda tek bir ZIP dosyasının boyutu 2 GB'ı (FAT32 destekli MMCmicro/microSD'lerde 4 GB'ı) aşamaz.
- zipfile.is_zipfile() Pratikliği: Bozuk bir dosyayı açıp çökmektense, işlem başında zipfile.is_zipfile(yol) ile kontrol yapmak en temiz yöntemdir.
- Standalone SIS Paketleme Kolaylığı: Kodları .py olarak bırakmak yerine Ensymble veya py2sis araçlarıyla bağımsız bir .sis haline getirirken app.uid çakışmalarına dikkat edilmelidir.
5 İlginç Bilgi
- Python 2.2.2 Çekirdeği: İlk popüler PyS60 sürümleri (1.0 - 1.4 serisi), 2002 çıkışlı Python 2.2.2 çekirdeğini kullanıyordu; bu yüzden liste üreteçleri ve modern döngü yapıları ilk cihazlarda syntax hatası veriyordu.
- HandyZip'in Kökeni: HandyZip, Rus yazılım şirketi Epocware (Paragon Software Group) tarafından geliştirilmişti ve motoru doğrudan Symbian C++ BAFL.DLL sıkıştırma kütüphaneleriyle optimize edilmişti.
- ZIP = Aslında Bir JAR/SISX: Nokia telefonlardaki .jar oyunları ve bazı S60v3 tema/kurulum paketleri aslında maskelenmiş ZIP arşivleridir; uzantıyı .zip yaparak HandyZip ile açıp içindeki görseller doğrudan alınabiliyordu.
- Symbian'ın 64 KB Yığın Limiti: PyS60 uygulamalarında tek bir değişkende 64 KB'tan büyük veri işlenmeye kalkışıldığında C++ motoru bellek sızıntısı sanıp User 42 panik koduyla uygulamayı anında kapatırdı.
- Nokia'nın Açık Kaynak Hamlesi: Nokia, PyS60 projesini 2005'te SourceForge üzerinde açık kaynak olarak başlattığında, cep telefonunda doğrudan yerel Python yorumlayıcısı çalıştıran ilk büyük üretici olmuştu.
2 Kaçamak (Geçici / Pratik Hile)
- Modül Yüklemeden ZIP Açma: Eğer telefonda zipfile modülü eksikse veya bozuksa, .zip uzantısını elle .jar yapıp sistemin kendi uygulama yükleyicisine ya da dahili bir Java MIDlet dosya tarayıcısına okutarak dosyaları dışarı çıkartmak mümkündür.
- Yeniden Paketlemeden Hızlı Yama: ZIP içindeki tek bir dosyayı değiştirmek için tüm arşivi yeniden yazmak yerine, arşivin sonundaki dizin tablosunu bozmadan aynı bayt boyutundaki değiştirilmiş dosyayı binary modda (r+b) doğrudan dosyanın başladığı ofset adresine yazmak mümkündür (dosya boyutu birebir aynı kalmak şartıyla).
3 Gizli Bilgi (Underground Püf Noktaları)
- sys\bin Korumasını Aşma (CapsOff / Open4All): S60v3 cihazlarda korumalı sistem dosyalarını ZIP içine doğrudan ekleyemezsiniz; bunu yapabilmek için RomPatcher üzerinden Open4All yamasını açarak çekirdeğin Capability Check mekanizmasını bellekte baypas etmek gerekir.
- ZIP BOM Tuzağı ve RAM Çökertme: Symbian dosya tarayıcıları, sıkıştırma oranı aşırı yüksek olan küçük arşivleri (klasik Zip Bomb) açmaya çalışırken bellek yönetimini kilitler ve cihazın beyaz ekranda kalarak yeniden başlamasına (soft reboot) neden olur.
- Gizli C:\System\Shareddata\ Veritabanı: HandyZip gibi arşiv yöneticileri, şifreli arşivlerin veya geçici açılan dosyaların küçük izlerini ve son kullanılan yollarını Shareddata altındaki UID tabanlı .ini/.dat dosyalarında düz metin olarak önbelleğe alır; dosya silinse bile adı burada kalır.