Forum: D Programlama Dili RSS
Dosya yeniden isimlendirme
zafer #1
Üye Tem 2009 tarihinden beri · 694 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Dosya yeniden isimlendirme
Bir süredir işyerinde bazı dosyaları yedeklemek için kullanabileceğim küçük bir yedekleme projesi üzerinde çalışıyorum. Hafta sonu yakaladığım bir kaç saatlik serbest zamanda yedekleme esnasında karşılaşılan aynı dosyanın farklı düzenlemeleri için bir çözüm arıyordum.

Sonunda aynı isimli dosyalar için ismin sonuna bir dosya sıra numarası eklemeye karar verdim. İtiraf edeyim başlangıçta gözüme çok basit gibi görünmüştü. Ancak işin içine girdikçe bir çok detayla yüzleşmek zorunda kaldım. Neticede ortaya aşağıdaki kodlar çıktı. Her türlü eleştiri ve iyileştirmeye açık durumdalar :) Ayrıca bu konuda farklı fikirleriniz varsa duymak isterim.

DPaste : https://dpaste.dzfl.pl/7e5069730616

import std.stdio;
import std.string;
import std.file;
import std.path;
import std.conv;
 
void main()
{
    int i = 0;
    while (i < 15)
    {
        string kaynak = "/home/zafer/Pictures/logo.png";
        string hedef = "/media/depo/test/logo.png";
        string isim = dosyaIsimlendir(hedef);
 
        writeln("Yeni dosya adi: " ~ isim);
 
        copy(kaynak, isim);
        i++;
    }
}
 
 
string dosyaIsimlendir(string dosya)
{
    if (!exists(dosya))
    {
        return dosya;
    }
    else
    {
        string uzanti = extension(dosya);
        string dosyaAdi = stripExtension(dosya);
 
        // logo veya logo(2)
        if (indexOf(dosyaAdi, '(') == -1)
        {
            dosyaAdi = dosyaAdi ~ "(1)" ~ uzanti;
        }
        else
        {
            int ilk = cast(int) indexOf(dosyaAdi, '(') +1;
            int son = cast(int) indexOf(dosyaAdi, ')');
            string numara = dosyaAdi[ilk..son];
 
            dosyaAdi = dosyaAdi[0..ilk-1] ~ "("~ to!string(to!int(numara) + 1) ~")" ~ uzanti;
        }
 
        return dosyaIsimlendir(dosyaAdi); 
    }
}
unittest
{
    mkdir("/tmp/test");
 
    string dosya = dosyaIsimlendir("/tmp/test/dosya.txt");
    assert(dosya == "/tmp/test/dosya.txt");
 
    // Hedef klasörde aynı isimde bir dosya oluşturalım.
    std.file.write("/tmp/test/dosya.txt", "test");
 
    // Hedef dosya yeniden isimlendirilmeli?
    dosya = dosyaIsimlendir("/tmp/test/dosya.txt");
    assert(dosya == "/tmp/test/dosya(1).txt");
 
    // Çevremizi temiz bırakalım :)
    std.file.remove("/tmp/test/dosya.txt");
    rmdir(DirEntry("/tmp/test"));
}
https://github.com/zafer06 - depo
Bu mesaj zafer tarafından değiştirildi; zaman: 2016-07-11, 07:19.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet, baştan çok basit görünen işlerin aslında nasıl karmaşık çıktıklarını çok iyi biliyoruz. :)

Bu konuyu başkaları nasıl hallediyor acaba. "increment numbers file name" gibi bir arama başka çözümler buluyor. Senin cözümünün göze çarpan bir sakıncası, dosya isminde zaten ilgisiz parantez karakteri olabilir.

indexOf'u görünce aklıma std.algorithm.find ve arkadaşları geldi. Sırf farklı bir şey olsun diye, numarayı şöyle de bulabiliriz:
import std.stdio;
import std.algorithm;
import std.range;
import std.conv;
 
void main() {
    auto sonuç = "foo(42).txt"
                 .find('(')     // Açma parantezini bul
                 .dropOne       // Bir elemanı bırak
                 .until(')')    // Kapama parantezini bul
                 .text          // Karakterleri birleştirerek dizgi oluştur
                 .to!int;       // O dizgiden int oluştur
 
    writeln(sonuç);
}
Ali
zafer #3
Üye Tem 2009 tarihinden beri · 694 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli on 2016-07-11, 09:14:
Senin cözümünün göze çarpan bir sakıncası, dosya isminde zaten ilgisiz parantez karakteri olabilir.

Evet, bu sakınca benimde aklımı kurcalıyor. Ancak şimdilik aklıma başka bir çözüm gelmiyor. nocall'ın önerdiği gibi bekli dosya adına tarih ve saat bilgisi eklenebilir ancak o zaman bu sadeliği kaybetmiş olacağım.

Örnek dosya: dosya_20160714_103059.txt

Örnek kodlama için teşekkürler Ali, benim de ufkumu genişletli, yine basit gibi görünen bu kodlama aslında karmaşıklığı (kodlama ve işlem) daha da arttırmıyor mu? Bir taraftan bu tür yapıları kullanmak istiyorum ancak ilerleyen zamanlarda örneğin text metodunda yapılacak bir değişikliğin programa nasıl yansıyacağını kestiremiyorum.
https://github.com/zafer06 - depo
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Haklısın. Ben bu kodları genelde fonksiyonel programlama denemesi amacıyla yazıyorum. :) Evet, text gibi her işlev de ileride değişebilir ama işlev davranışlarının değişmeyeceğine bir miktar güvenmek zorundayız.

Ali
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
zafer:
basit gibi görünen bu kodlama aslında karmaşıklığı (kodlama ve işlem) daha da arttırmıyor mu?

Seninle aynı fikirde olan bir yazı daha bugün Reddit'te çıktı:

  https://www.reddit.com/r/programming/comments/4st4t0/why_m…

Yazının tamamını okumadım ama benim denemelerimdeki gibi akıllı olmaya çalışan kodların ileride sorunlara neden olabileceğinden bahsediyor.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-06-24, 22:27:05 (UTC -07:00)