Thread overview
Dosya yeniden isimlendirme
Jul 11, 2016
zafer
Jul 13, 2016
zafer
July 11, 2016

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"));
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 11, 2016

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 14, 2016

Alıntı (acehreli:1468253642):

>

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.

Alıntı:

>

Ö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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 14, 2016

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 14, 2016

Alıntı (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_most_clever_code_aint_so_clever_after_all_by/

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]