Dosyalarda gömme işlemi

Yapacağınız programın exe uzantılı bir dosya oluşturması zorunlu mu ? Başka formatta olmaz mı text mesla ?

Hayır exe dosyası oluşturmalıyım.

Ayrıca bu teknikle .exe dosyasına gömme yapmak .exe dosyasının sağlığını nasıl etkiler bilemiyorum.

Maalesef bir bilgim yok aklıma fikir de gelmiyor . Tek aklıma gelen zip dosyasının içeriğini binary olarak saklamak .

https://stackoverflow.com/questions/21736329/embed-file-in-a-executable Belki yardımcı olur

Exe dosyasının içerisine gömmek istediğiniz dosyanın byte verisini program içerisine byte dizisi olarak saklayabilir, sonra program çalıştığı zaman bu dosyayı dışarı aktarabilirsiniz.Ya da base64 olarak şifreleyip, dışarı aktaracağınız zaman bunu çözerek aktarabilirsiniz. Mesela aşağıdaki programı çalıştırırsanız size bir resim dosyası çıkaracaktır.

# coding:utf-8
# coderistan

import base64

image = """
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
"""

def cikart(kaynak):
    with open("resim.png","wb") as dosya:
        byte = base64.b64decode(kaynak)
        dosya.write(byte)

    print("Dosya başarılı bir şekilde çıkarıldı")



cikart(image)
3 Beğeni

Hocam ama zip dosyası 10 gb’a kadar çıkabiliyor. Buna karşın ne önerebilirsiniz? Aksi takdirde MemoryError verebilir.

Tam olarak ne yapmak istediğinizi yazarsanız, alternatif çözümlere bakabiliriz. 10 gb dosyayı program içerisine gömmek sıkıntılı olur, üstüne etik olmaz.

Mesela burada da, böyle birşey yapmamanızı öneriyorlar. Bunun yerine MSI oluşturmanızı öneriyorlar.

2 Beğeni

ZIP değil de tar, gz, xz, 7z, vb. biçimler kullanın. Bunlar hem daha iyi sıkıştırır hem de boyut kısıtı yok bildiğim kadarıyla. Tabii bazı dosyalar (mesela sıkıştırılmış resimler) ne yaparsanız yapın daha fazla sıkışmaz. Bir de şunu söyleyeyim: Yukarıda bahsettiğim biçimler birlikte de kullanılabilir, böylece daha iyi sıkıştırma sağlanır.

1 Beğeni

Projemden bahsedeyim.

Bu proje portable programlar ile alakalı. Portable programlar nereye taşınırlarsa taşınsınlar her yerde çalışırlar. Benim amacım ise, kullanıcıdan programın klasörünü alıp içinden bir executable seçmesini isteyerek klasörü sıkıştırıyorum, bir .exe dosyasına görmüyorum. Exe dosyası çalıştığında ise sıkıştırılmış dosyayı çıkartıp içinden executable olarak seçtiği dosyayı çalıştırıyor, kapanınca da siliyor. Bu yüzden program 40 GB bile olabilir.

Sonuç olarak; çalışması için bir çok dosya gereken programların o dosyalarını tek dosya haline getirerek basit ve pratik bir şekilde kolayca taşınabilir hale gelmesini sağlayacak bir proje üzerinde çalışıyorum.

İşte o yüzden Python programının .exe oluşturabilmesi gerekiyor:

Portable olacaksa neden bir sıkıştırma yöntemi kullanmıyorsunuz da, onun yerine exe kullanıyorsunuz? Bunun yerine her platform için ayrılmış sıkıştırılmış dosyaları kullanıcıya dağıtabilirsiniz. Kullanıcı her zaman bilgili olmayabilir çünkü, sizin herşeyi halletmeniz gerekir.

Tam anlayamadım, şunu detaylıca anlatabilir misiniz size zahmet hocam?

Yani şunu demek istiyorum. Sizin amacınız programlarınızın her platform için yazılmış halini kullanıcılara sunmak değil mi? Bunu da exe kullanarak yapmak istiyorsunuz. Ancak kullanıcı linux kullanıyorsa bu durumda sizin yazdığınız exe dosyasından faydalanamayacak.

Ancak programınızı zip,rar gibi sıkıştırma yöntemleri ile sıkıştırıp dağıtırsanız kullanıcı kendi sistemi için ilgili dosyayı indirecek ve kullanacaktır.

Ya da ben mi yanlış anladım sizi?

Öyle oldu hocam ben her yerde çalışacak derken sade, basit, kullanıcının yedekleyebileceği taşıyabildiği program. Windows’ta çalışacak yani. Böyle çok büyük programlar daha sade olacak, kullanıcıya karışık görünmeyecek.

1 Beğeni

Anladım. O zaman şunu diyorsunuz, program bir bilgisayarda çalıştı, yerleşti. Sonra kullanıcı bu programı, ayarlarını da koruyarak dosyaları ile birlikte, bir başka bilgisayarda çalıştırmak istesin. Ve olduğu gibi taşıyınca bir sorun çıkmasın. Bunu mu demek istiyorsunuz?

Bu programın kullanılabileceği bir durum mesela hocam. Programın yapacağı görev şu:

Atıyorum pes 2009. Çalışması için bir sürü dosya gereklidir. Bu dosyalar tek klasörde olmalıdır. Kullanıcı program-files klasöründen kurulu olduğu klasörü bulur, programa dizini ve içindeki launcher’ı verir. Program o klasörü zipler, bir exe dosyasına gömer. O exe dosyası ise çalışırsa kendisine gömülen zip dosyasını çıkartır. İçinden kullanıcının seçtiği launcher’i çalıştırır, kullanıcı oyunu oynayıp kapatınca tekrar zipleyerek kendisine tekrar kendisine gömer ve kapanır.

1 Beğeni

Anladım. Yukarıda örneği verdiğim yoldan başka aklıma birşey gelmiyor. Dosya boyutu büyüdükçe sıkıntı çıkaracaktır, bu durumda sıkıştırma işlemi gerekir. MemoryError demişsiniz evet ama, siz de aynı şekil GB’larca zip dosyasını exe dosyasına gömerseniz yine aynı sorun çıkacaktır. Ama yine de aklıma gelen yöntem, program ve zip dosyasını beraber dağıtmak. Yani exe programı, kendisiyle beraber dağıtılan zip dosyasını açacak ve kullanıcı işini görecek. Tekrar çalıştırınca da açtığı bu dosyaları silecek

Ama kullanıcı neden böyle bir şey istesin ki? Dosya boyutu büyükse, her seferinde bu dosyaları çıkarmasını ve silmesini bekleyecek. Bu da her seferinde büyük işlem gücü gerektirecek.

Docker’a bakın, aradığınızı bulacaksınız.