bir süredir tcl dökümanları toplamaya oluşturmaya + çevirmeye çalışıyorum. aşağıdaki örneklemeler faydalı olacaktır.
.dosya prosedürleri: [yazma,silme,okutma,degisme,vs..)
dosya kontrolü
kullanim:
dosyakontrol dosyaismi
dosyakontrol <dosyaismi>
return
1 dosya varsa,aksi halde 0
Kod: Kodu kopyalamak için üzerine çift tıklayın!
proc dosyakontrol {dosyaismi} {
# dosyanin olup olmadigina bakiyoruz
if [dosya exists $dosyaismi] then {
# dosya var.
return 1
} else {
# dosya yok.
return "0"
}
}
örnek:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
if {[dosyakontrol dosyaismi.txt]} then { set text "dosya var" } else { set text "dosya bulunamadi" }
set result [dosyakontrol dosyaismi.txt] ; # 0 yada 1 olarak $result ta donecektir.
-----------------------------------------------------------------------
okutma:
dosyadanoku dosyaismi ?satir?
dosyadanoku <dosyaismi> [satir]
Return:
hatada 0 aksi <else> halde postala
Kod: Kodu kopyalamak için üzerine çift tıklayın!
proc dosyadanoku {dosyaismi {satir 0}} {
# dosyanin olup olmadigi ve okunabilirligi kontrol ediliyor.
if {[dosya exists $dosyaismi] && [dosya readable $dosyaismi]} then {
# okuma icin dosyayi aciyoruz
set dosya [open $dosyaismi r]
if {$satir!=1} then {
# okuma islemi
set oku [read -nonewline $dosya]
} else {
# satir oku
set oku [get $dosya]
}
# postala ve dön
close $dosya
return $oku
}
# okunabilir degilse
return 0
}
dosya okumayi tamamlar yada sadece ilk satirindan okur (satir 1 oldugunda*)
örnek:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
proc dosyadanoku {dosyaismi satirno {yontem 1}} {
# okumaya satir 0'dan basla satir 1 satir 2...satir 90,91...devam et.
proc Eofileokut {dosya satirno} {
set okumano 0
# eof (end of file) yani dosya sonuna gelinceye dek satirlari oku
while ![eof $dosya] {
set satir [gets $dosya]
if {$satirno==$okumano} {return $satir}
incr okumano
}
# hataliysa
return 0
}
proc tamaminiokuvesirala {dosya satirno} {
# tum dosyayi oku
set okuyoz [read -nonewline $dosya]
# listele
set liste [split $okuyoz \n]
# sonuc olarak ciktisi
return [lindex $liste $satirno]
}
# dosyayi ve yaptirmak istediklerimizi (parametreleri) kontrol et, hata varsa don geri.
if {![dosya exist $dosyaismi] || ![dosya readable $dosyaismi] || ![string is digit $satirno]} {return 0}
# dosyayi ac
set dosya [open $dosyaismi r]
if {$yontem!=1} {
# ilk proseduru uygulat
set satir [Eofileokut $dosya $satirno]
} {
# ikinci (tanimladigimiz) proseduru uygula (yani sirayla oku.adami ugrastirma aksam aksam..)
set satir [tamaminiokuvesirala $dosya $satirno]
}
close $dosya
return $satir
}
uygulamalar:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
set text [dosyadanoku dosyaismi.txt]; foreach satir [split $text \n] { puthelp "privmsg #kanal :$satir" }
set ilksatir [dosyadanoku dosyaismi.txt 1]; # dosyaismi.txt teki ilk satiri oku
set ilksatir [dosyadansatiroku "eggdrop.conf" 0 0]; # eggdrop.conf taki ilk satirdan okutma oku/siralat yontemiyle.
set satir [dosyadansatiroku "eggdrop.conf" 50 0]; # eggdrop.conf satir 51 e kadar gets/eof yontemiyle daha yavasca oku (hafiza kullanimi icin daha iyi) .
-----------------------------------------------------------------------
yazdirma:
dosyabilgiyaz dosyaismi icerik ?otoekleme?
dosyabilgiyaz <dosyaismi> <icerik> [otoekleme]
return 1 # isler tikirindaysa...
Kod: Kodu kopyalamak için üzerine çift tıklayın!
proc dosyabilgiyaz {dosyaismi icerik {otoekleme 0} {yenisatir 1}} {
# dosya yoksa yada oto ekleme/yazma olmuyorsa olusturma/usteyazma
if {![dosya exists $dosyaismi] && $otoekleme!=1} then {
# yazma yontemi icin dosyayi aciyoruz
set dosya [open $dosyaismi w]
} else {
# ekleme yontemi icin aciyoruz
set dosya [open $dosyaismi a]
}
# icerigi yazdiriyoruz
if $yenisatir {puts $dosya $icerik} {puts -nonewline $dosya $icerik}
# postalama ve yazdirma isleri tikirindaysa return 1
close $dosya
return 1
}
dosyaismi - dosya ayarlarini otoekleme 1 ile geri ekler/yonlendirilir daha sonra icerik bu dosyada tutulur.
-----------------------------------------------------------------------
kopyalama ,kaldirma ,silme ,yeniden adlandirma:
kullanim sekli:
dosyailet dosyaismi ?tasi?
dosyailet <dosyaismi> [tasi]
olumluysa return 1 degilse 0
Kod: Kodu kopyalamak için üzerine çift tıklayın!
proc dosyailet {dosyaismi {tasi 0}} {
if [dosya exists $dosyaismi] {
if [dosya exists $dosyaismi.bak] {dosya delete $dosyaismi.bak}
if {$tasi==1} {
dosya rename $dosyaismi $dosyaismi.bak
} {
dosya copy $dosyaismi $dosyaismi.bak
}
return 1
}
return 0
}
-----------------------------------------------------------------------
satirlar işlemleri
:
kullanimi:
dosyasatirsil dosyaismi satirindan ?satirina? ?geriyukle?
dosyasatirsil <dosyaismi> <satirindan> [satirina] [geriyukle]
hersey yolundaysa return 1
Kod: Kodu kopyalamak için üzerine çift tıklayın!
proc dosyasatirisil {dosyaismi satirindan {satirina -1} {geriyukle 1}} {
if {![dosya exist $dosyaismi] || ![dosya readable $dosyaismi]} {return 0}
if {![string is digit $satirindan] || ![string is digit $satirina]} {return 0}
if {$satirina==-1} {set satirina $satirindan}
# dosyayi acalim ve listeden okutalim
set dosya [open $dosyaismi r]
set liste [split [read -nonewline $dosya] \n]
close $dosya
# satirlari listeden kaldiralim
set liste [lreplace $liste $satirindan $satirina]
# olustur [yoksa] geri yukle
if {$geriyukle!=0} {
# yeniden isimlendirme [zorlayarak yapacagiz cunku eski geri yuklemeler duruyor olabilir)
dosya rename -force $dosyaismi $dosyaismi.bak
}
# dosyanin ustune yazdirip geri koyuyoruz.
set dosya [open $dosyaismi w]
puts -nonewline $dosya [join $liste \n]
close $dosya
return 1
}
diger bir ornek: yukardaki alistirmadaki gibi yazdirma okutma proseduruyle .
Kod: Kodu kopyalamak için üzerine çift tıklayın!
proc baskasatirsil {dosyaismi satirindan {satirina -1} {geriyukle 1}} {
if {![string is digit $satirindan] || ![string is digit $satirina]} {return 0}
set yukleme [split [dosyaoku $dosyaismi] \n]
if {$yukleme!=0} {
set yukleme [lreplace $yukle $satirindan $satirina]
if {$geriyukle==1} {dosyageriyukle $dosyaismi 1}
# yeni bir satir yada ekleme olmaksizin yuklemeyi yazdirma
set sonuc [dosyayazdir $dosyaismi [join $yukleme \n] 0 0]
if {$sonuc!=1} {
# hataliysa
return 0
}
# tamamsa
return 1
}
# olmadiysa
return 0
}
dosyadan siralama gozetmeksizin (random) satir okutma:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
# dosyadan herhangi bir satiri dondurur (mevcud degilse hata verecektir.)
proc satirlar {dosya} {
set fs [open $dosya r]
set bilgi [read -nonewline $fs]
close $fs
# simdi bilgilerin depolandigi dosyanin tum icerigini gosterecegiz
set bilgi [split $bilgi \n]
# burda satirlari listeleyip eggdrop'un "rand" isleviyle yani siralama gozetmeksizin dosya icindeki elemanlari cekecegiz(ve dondurucez))
#return [lindex $bilgi [rand [llength $bilgi]]]
# yada tcl'deki "rand" fonksiyonu-isleviyle degisilebilir.
return [lindex $bilgi [expr {int(rand()*[llength $bilgi])}]]
}
dosyadaki belirli bir satiri baskasiyle degismek-ustune yazma:
!degis
set satir1 [satirdegis "$dosya" 0 0]
putserv "privmsg $chan :satir $satir1 degistirildi."
gibi olacak...
örnek:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
proc dosyasatirdegis {dosyaismi satirno yenitxt {geriyukle 1}} {
if {![dosya exist $dosyaismi] || ![dosya readable $dosyaismi]} {return 0}
if {![string is digit $satirno]} {return 0}
# dosyayi acip listeden okutalim
set dosya [open $dosyaismi r]
set liste [split [read -nonewline $dosya] \n]
close $dosya
# listedeki texti degistirelim
set liste [lreplace $liste $satirno $satirno $yenitxt]
# olustur (yoksa) geri yukle
if {$geriyukle!=0} {
# dosyayi yeniden isimlendiriyoruz (buna zorluyoruz eski geri yuklemeler hala duruyor olabilir)
dosya rename -force $dosyaismi $dosyaismi.bak
}
# dosyanin üstünden yazdirip geri yuklemeleri koyuyoruz.
set dosya [open $dosyaismi w]
puts -nonewline $dosya [join $liste \n]
close $dosya
return 1
}
şimdilik bu kadar.umarım işinize yarar.