Bu projeyle birlikte amacım aslında zaten işlevsel olan cp uygulamasını kendime göre daha iyi olacağını düşündüğüm özellikler ekleyerek tekrar şekillendiriyorum denebilir. Proje şu an emekleme döneminde, o yüzden daha kaynak kodlarını açmadım. Günlük kullanıma uygun olduğunu düşündüğüm zaman GitHub deposunu herkese açacağım.
cppp, kopyalanacak olan dosyayı kullanıcının belirlediği kadar parçaya bölüp parça parça kopyalayan bir araç. Dosya parçalara bölünerek kopyalandığı için kopyalanan parçada bir sorun oluştuğunda o parçanın yerine doğru olan parça eklenip kopyalama işlemi devam edecek. En son dosya kopyalandığında, kaynak hedefteki dosyanın SHA256 hash değeri ile hedef konumdaki dosyanın SHA256 hash değeri karşılaştırılacak ve bir problem yoksa işlem sonlandırılacak.
Özellikler
Gelelim özelliklere.
1. Kopyalama Sırasında SHA256 Hash Kontrolü (sha256.h)
Veri güvenliği açısından eğer dosya kopyalanırken bir hata oluşursa diye SHA256 hash kontrolü program tarafından yapılıyor.
C:
int calculate_sha256(const char *file_name, char hash_str[HASH_STR_LEN]);
Kaynak kodumuzdaki bu fonksiyon bizim işimizi görüyor. Kısaca C programı içinde file_name olarak verdiğiniz dosya isminin SHA256 hash değerini char hash_str[HASH_STR_LENG] değişkeninin içine yazıyor ve işlem başarılıysa EXIT_SUCCESS, değilse EXIT_FAILURE dönüyor. Performans açısından sha256sum programıyla kıyası aşağıdaki fotoğrafta görebilirsiniz. sample_file dosyası şu komutla oluşturulmuş 30 GB boyutunda bir dosya:
2. Dosyayı İstenilen Kadar Parçaya Ayırmak (split.h)
C:
int split_file(const char* file_name, off_t num_parts);
Daha tanımlanmamış olan kopyalama fonksiyonu dosyaları parçalara bölerken bu fonksiyonu kullanacak. Burada file_name ile verdiğimiz dosyayı num_parts kadar parçaya bölebiliyoruz. Tabi dosyayı bölerken düzgün bölebilmek için dosyanın bilgilerini tutabileceğimiz bir struct yapımız var:
get_file_info fonksiyonu bizim için file_name'de verilen dosyanın num_parts kadar parçaya bölüneceği zaman boyut değerlerinin nasıl olmasını gerektiğini ve o dosyanın hangi izinlere sahip olduğunu bizim için döndürüyor. Gerçekten düzgün çalışıp çalışmadığını görmek için aşağıdaki örneğe bakabiliriz:
Gördüğünüz gibi sonuçlar böyle. Şöyle düşünüyor olabilirsiniz: "Eğer parça sayısı bayt sayısından büyük olursa ne olacak?" Yani mesela 1 bayt'lık dosyayı 10 parçaya nasıl bölecek? O durumda da part_size 0, last_part_size ise dosyanın kendi boyutunda oluyor.
Bu kısmın belki açıkları olabilir o yüzden "şimdilik" işe yaradığını söyleyebilirim. Kontrolleri elimden geldiğince yapmaya çalıştım burada. Kaynak kodlar açılınca bu durumu incelemek isteyenler ve sorun bulursa düzeltilmesi için yardımda bulunmak isteyenleri seve seve karşılıyorum
3. Dosya Birleştirme (merge.h)
Adından da anlaşılacağı üzere dosyaları birleştirmeyi sağlıyor.
C:
int merge_files(const char *first_file, const char *second_file);
first_file'in sonunda second_file'ın verilerini eklemekle sorumlu bu fonksiyon. Çok komplike bir yanı yok.
Bu fonksiyonu yazarken çok eğlendim açıkçası. Yaptığı şey, file_name'i veriyoruz, daha sonra bu dosyanın num_parts kadar parçaya ayrıldığını söylüyoruz ve part_location verdikten sonra new_data_file_name veriyoruz. Bu bilgilerden sonra file_name'in part_location'dan sonraki parçasına new_data_file_name'i yazıyor. Görsel ile açıklayayım:
Bu işlem gerçekleşirken fonksiyon num_parts ve part_location değerlerini kontrol ediyor. Eğer part_location değeri num_parts değerinden büyükse, böyle bir şey imkansız olduğu için hata veriyor ve işlem durduruluyor. Eğer part_location ve num_parts eşitse, merge_files() fonksiyonu çağrılıyor ve direkt dosyanın sonuna ekleniyor. Eğer part_location değeri num_parts değerinden küçükse, başlanacak konum part_size * part_location değeriyle byte cinsinden belirleniyor.
Şimdilik özelliklerimiz bu kadar. Eğer gelse güzel olur dediğiniz mantıklı bir özellik varsa belirtmekten çekinmeyin.
Eklenmesi Düşünülen Özellikler
Multi-thread kopyalama işlemi
İşlem sırasında bir parça yanlış kopyalandıysa, o hata tespit edilip otomatik olarak hatayı düzeltecek şekilde işlemleri gerçekleştirmek
Klasör kopyalama
Son
Şimdilik bu kadardı. Gelişmeler oldukça buraya yazmaya çalışacağım. Önerilerinizi ve görüşlerinizi bekliyorum. Başta belirttiğim gibi kaynak kodlar kullanıma hazır olduğunu düşündüğüm anda açılacak. Ayrıca Windows'a destek verir miyim bilmiyorum. MinGW ile doğrudan çalışırsa ekstra bir çaba sarf etmeye gerek kalmadan orada da dağıtılması sağlanabilir.
Özellikle arayüz daha uğraştırıcı geldiği için dosya işlemlerini görsel işlemler haricinde terminalden yapan biri olarak oldukça beğendim. Ellerine sağlık hocam.
Özellikle arayüz daha uğraştırıcı geldiği için dosya işlemlerini görsel işlemler haricinde terminalden yapan biri olarak oldukça beğendim. Ellerine sağlık hocam.
Bu projeyle birlikte amacım aslında zaten işlevsel olan cp uygulamasını kendime göre daha iyi olacağını düşündüğüm özellikler ekleyerek tekrar şekillendiriyorum denebilir. Proje şu an emekleme döneminde, o yüzden daha kaynak kodlarını açmadım. Günlük kullanıma uygun olduğunu düşündüğüm zaman GitHub deposunu herkese açacağım.
cppp, kopyalanacak olan dosyayı kullanıcının belirlediği kadar parçaya bölüp parça parça kopyalayan bir araç. Dosya parçalara bölünerek kopyalandığı için kopyalanan parçada bir sorun oluştuğunda o parçanın yerine doğru olan parça eklenip kopyalama işlemi devam edecek. En son dosya kopyalandığında, kaynak hedefteki dosyanın SHA256 hash değeri ile hedef konumdaki dosyanın SHA256 hash değeri karşılaştırılacak ve bir problem yoksa işlem sonlandırılacak.
Özellikler
Gelelim özelliklere.
1. Kopyalama Sırasında SHA256 Hash Kontrolü (sha256.h)
Veri güvenliği açısından eğer dosya kopyalanırken bir hata oluşursa diye SHA256 hash kontrolü program tarafından yapılıyor.
C:
int calculate_sha256(const char *file_name, char hash_str[HASH_STR_LEN]);
Kaynak kodumuzdaki bu fonksiyon bizim işimizi görüyor. Kısaca C programı içinde file_name olarak verdiğiniz dosya isminin SHA256 hash değerini char hash_str[HASH_STR_LENG] değişkeninin içine yazıyor ve işlem başarılıysa EXIT_SUCCESS, değilse EXIT_FAILURE dönüyor. Performans açısından sha256sum programıyla kıyası aşağıdaki fotoğrafta görebilirsiniz. sample_file dosyası şu komutla oluşturulmuş 30 GB boyutunda bir dosya:
2. Dosyayı İstenilen Kadar Parçaya Ayırmak (split.h)
C:
int split_file(const char* file_name, off_t num_parts);
Daha tanımlanmamış olan kopyalama fonksiyonu dosyaları parçalara bölerken bu fonksiyonu kullanacak. Burada file_name ile verdiğimiz dosyayı num_parts kadar parçaya bölebiliyoruz. Tabi dosyayı bölerken düzgün bölebilmek için dosyanın bilgilerini tutabileceğimiz bir struct yapımız var:
get_file_info fonksiyonu bizim için file_name'de verilen dosyanın num_parts kadar parçaya bölüneceği zaman boyut değerlerinin nasıl olmasını gerektiğini ve o dosyanın hangi izinlere sahip olduğunu bizim için döndürüyor. Gerçekten düzgün çalışıp çalışmadığını görmek için aşağıdaki örneğe bakabiliriz:
Gördüğünüz gibi sonuçlar böyle. Şöyle düşünüyor olabilirsiniz: "Eğer parça sayısı bayt sayısından büyük olursa ne olacak?" Yani mesela 1 bayt'lık dosyayı 10 parçaya nasıl bölecek? O durumda da part_size 0, last_part_size ise dosyanın kendi boyutunda oluyor.
Bu kısmın belki açıkları olabilir o yüzden "şimdilik" işe yaradığını söyleyebilirim. Kontrolleri elimden geldiğince yapmaya çalıştım burada. Kaynak kodlar açılınca bu durumu incelemek isteyenler ve sorun bulursa düzeltilmesi için yardımda bulunmak isteyenleri seve seve karşılıyorum
3. Dosya Birleştirme (merge.h)
Adından da anlaşılacağı üzere dosyaları birleştirmeyi sağlıyor.
C:
int merge_files(const char *first_file, const char *second_file);
first_file'in sonunda second_file'ın verilerini eklemekle sorumlu bu fonksiyon. Çok komplike bir yanı yok.
Bu fonksiyonu yazarken çok eğlendim açıkçası. Yaptığı şey, file_name'i veriyoruz, daha sonra bu dosyanın num_parts kadar parçaya ayrıldığını söylüyoruz ve part_location verdikten sonra new_data_file_name veriyoruz. Bu bilgilerden sonra file_name'in part_location'dan sonraki parçasına new_data_file_name'i yazıyor. Görsel ile açıklayayım:
Bu işlem gerçekleşirken fonksiyon num_parts ve part_location değerlerini kontrol ediyor. Eğer part_location değeri num_parts değerinden büyükse, böyle bir şey imkansız olduğu için hata veriyor ve işlem durduruluyor. Eğer part_location ve num_parts eşitse, merge_files() fonksiyonu çağrılıyor ve direkt dosyanın sonuna ekleniyor. Eğer part_location değeri num_parts değerinden küçükse, başlanacak konum part_size * part_location değeriyle byte cinsinden belirleniyor.
Şimdilik özelliklerimiz bu kadar. Eğer gelse güzel olur dediğiniz mantıklı bir özellik varsa belirtmekten çekinmeyin.
Eklenmesi Düşünülen Özellikler
Multi-thread kopyalama işlemi
İşlem sırasında bir parça yanlış kopyalandıysa, o hata tespit edilip otomatik olarak hatayı düzeltecek şekilde işlemleri gerçekleştirmek
Klasör kopyalama
Son
Şimdilik bu kadardı. Gelişmeler oldukça buraya yazmaya çalışacağım. Önerilerinizi ve görüşlerinizi bekliyorum. Başta belirttiğim gibi kaynak kodlar kullanıma hazır olduğunu düşündüğüm anda açılacak. Ayrıca Windows'a destek verir miyim bilmiyorum. MinGW ile doğrudan çalışırsa ekstra bir çaba sarf etmeye gerek kalmadan orada da dağıtılması sağlanabilir.
Bu fonksiyon "Veri Ekleme (insert)" gibi çalışıyor ama bir fark var. Bu fonksiyon seçilen parçanın üzerine doğrudan veriyi yazıyor. Yani dosya eğer 16 parçaysa yine 16 parça olarak kalmaya devam ediyor.
parts_data = {a, b, c, d, e, f, g, h, j, k, l, m, n, o, p, r, s}
parts_data = {a, b, c, z, e, f, g, h, j, k, l, m, n, o, p, r, s}
Bu şekilde çalışıyor.
3. İlerleme Çubuğu (progress_bar.h)
Şu an için birkaç işlem için koydum ilerleme çubuğunu ve hedefim bunu isteğe bağlı yapmak. Çünkü işlem süresini uzatıyor. İsteyen istediği gibi aktif edebilsin diye uğraşacağım.
Mesela SHA256 hash değeri kontrolü yaparken işlemin ne kadar uzun süreceği dosya boyutuna bağlı olarak değişiyor. Biz de en azından ilerlemenin ne durumda olduğunu görebileceğiz. Bu yüzden kullanışlı olduğunu düşünüyorum.
Bu şekilde gözüküyor. Tasarım konusunda öneriniz varsa mesaj olarak bekliyorum.
YENİ GÜNCELLEME!
Bir sürü özellik şu an ekli durumda ancak CLI üzerinden kontrol edilmeye hazır değil. Onları da implemente ettikten sonra artık hazır durumda!
Kaynak kodunu nihayet açabildim. Aşağıdaki GitHub adresinden gidip kontrol edebilir, sisteminizde derleyebilir ve kullanmaya başlayabilirsiniz!
Hocam uygulamaya tui yazmayı planlıyor musunuz? Hash çıktısı ile yükleme barı arasına ufak bir çizgisi çekebilirseniz daha anlaşılır olabilir. Alttaki görseldeki gibi ise.
Hocam uygulamaya tui yazmayı planlıyor musunuz? Hash çıktısı ile yükleme barı arasına ufak bir çizgisi çekebilirseniz daha anlaşılır olabilir. Alttaki görseldeki gibi ise.
O fotoğraftaki gibi değil, güncelledim o kısmı. Deneyip görseniz daha iyi olur. Ayrıca şu an için TUI yazma gibi bir planım yok. Eğer yaparsanız PR atmayı unutmayın.