- Katılım
- 15 Nisan 2021
- Mesajlar
- 7.750
- Makaleler
- 22
- Çözümler
- 279
Daha fazla
- Sistem Özellikleri
- Laptop: ASUS TUF Gaming F15 FX506LHB-HN323
İşlemci: i5-10300H
Ekran kartı: GTX 1650
RAM: 16 GB 3200 MHz DDR4 Laptop
Dahili Depolama: Intel SSDPEKNU512GZ
- Cinsiyet
- Erkek
- Meslek
- Öğrenci
Giriş
Bu projeyle birlikte amacım aslında zaten işlevsel olancp 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:
Bash:
dd if=/dev/urandom of=sample_file bs=1G count=30 status=progress
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:
C:
struct file_info {
off_t file_size;
off_t part_size;
off_t last_part_size;
off_t num_parts;
mode_t permissions;
};
struct file_info get_file_info(const char* file_name, off_t num_parts);
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.4. Veri Ekleme (insert.h)
C:
int insert_data(const char *file_name, off_t num_parts, off_t part_location, const char *new_data_file_name);
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.GitHub - kernelginar/cppp: cp++, a better version of cp
cp++, a better version of cp. Contribute to kernelginar/cppp development by creating an account on GitHub.
Son düzenleme: