Yazar |
|
barbi
istanbul
Kayıt: 24.01.2006 |
|
Şu güzel tatil gününde C de anlıyamadığım bişeyi soracam
bir dosyadan bikaç şey silmek için yeni bir dosya açıp, dosyadan silmeyeceklerimi o dosyaya kopyalamak, sonradan da eski dosyayı silip yeni dosyanın ismini değiştirmeye çalışıyorum. Ama rename() ve remove() fonksiyonlarını kullandığımda ikiside hiçbir işe yaramadı. yani yeni dosyaya istediklerim kopyalanıyor ama ne ismi değişiyor ne de eski dosya siliniyor. Bu iki fonk.un nasıl çalıştığı hakkında bilgisi olan varsa biraz yardımcı olabilirmi?
herkese ii tatiller
people pray for strength, and guidance; they should pray for the mercy of a swift death...
|
|
Yazar |
|
tarikkranda
Kayıt: 07.01.2006 |
|
Selamlar,
her iki fonksiyonu defalerca kullanmışımdır ve hiç bir problem yaşamadım şu ana kadar. Yani herikiside hem siliyor, hem de yeniden adlandırma yapabiliyor kendi kodlarımdan biliyorum. Acaba dosya adlarını su sekilde mi veriyorsunuz ornegin rename("C:\\a.txt","C:\\b.txt") ya da remove("C:\\b.txt") gibi. Ya da daha once yaptıgınız islemlerde(dosyadan bikac satır silmek , vs..) bildiginiz gibi dosyaya bir stream acıyorsunuz. FILE * di = fopen(...vs) bu stream i kapamayı mı unutmus olabilirsiniz bu islemleri yapmadan once. Ben denemedim ama acık unutlmus bu streamler dosyaların kullanıldıgı anlamına gelir ve biliyorsunuzki kullanımda olan dosyaların ismini degistirme , silme gibi islemler isletim sisteminin guvenlik yuzugunun (ring 0) sorunlulugundadır ve sizi durdurabilir bir interrupt ile. Streamleri kapatıp deneyin. Hatta sunu direkt deneyin programınızın calıstıgını goreceksiniz.
1) C diskine a.txt isminde bir dosya acın
2) Su kodu yazın:
#inlude <stdio.h>
int main(void)
{
remove("C:\\a.txt");
retrun 0;
}
3) Eger bu kod calısmamıssa o zaman bir daha konusalım derim.
|
|
Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
cpp olsa soyle olurdu yalnız \ bu bolu cizgisinden iki tane olmalı. filtreye takılıyor.
#include <iostream>
#include <cstdio>
using std::cout;
using std::endl;
int main (){
int flag=rename("c:\old.txt", "c:\new.txt");
if(flag==0){
cout<<"oldi"<<endl;
}else{
cout<<"olmadi"<<endl;
}
return 0;
}
N/A
|
|
Yazar |
|
barbi
istanbul
Kayıt: 24.01.2006 |
|
anlatılan şekillerde kullandım. dosyalarıda rename ve remove u kullanmadan kapatmıştım. Ama Tarık senin dediğini yazdığımda dosyayı silebildim. ben dosya ismini dizide tutuyordum. O zaman fonksiyon kullanışımdan değilde dizide bir sorun oldu. kod şöyleydi :
remove(path);
rename("temp.txt", path); //temp dosyası proje ile aynı klasör içerisinde
people pray for strength, and guidance; they should pray for the mercy of a swift death...
|
|
Yazar |
|
tarikkranda
Kayıt: 07.01.2006 |
|
barbi yazdi | anlatılan şekillerde kullandım. dosyalarıda rename ve remove u kullanmadan kapatmıştım. Ama Tarık senin dediğini yazdığımda dosyayı silebildim. ben dosya ismini dizide tutuyordum. O zaman fonksiyon kullanışımdan değilde dizide bir sorun oldu. kod şöyleydi :
remove(path);
rename("temp.txt", path); //temp dosyası proje ile aynı klasör içerisinde
|
rename islemi bir sorun ile karsılastıgında 0 error kodu nu dondurur, Orhanın yazdıgfı Cpp kodundaki flag de bunu kontrol ediyor, o koda bir bak. Ama bence bir watch yaparak diziden gelen path ismine bak derim ben oncelikle. Hatta kodundaki path i diziden alıosun galba, oraya elle direkt yaz silecegin dosyanın adını benim gonderdigim koddaki gibi. Boylece path in diziden eksik ya da yanlis dondugunu direkt anlamıs olursun.
|
|
Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
0 okmiş abi. hata olursa -1 donduruyomuş. bana ilginc geldi.
N/A
|
|
Yazar |
|
tarikkranda
Kayıt: 07.01.2006 |
|
orhan yazdi | 0 okmiş abi. hata olursa -1 donduruyomuş. bana ilginc geldi. |
evet dogru pardon ters yazmısım Zaten dogalı hata olursa -1 dondurmesi. Bu bir standart aslında ben de oyle kullanıyorum kendi fonksiyonlarımda, cunku bir fonksiyonun ya da prosesin dogru calıstıgını anlamak icin tek bir deger dondurmek yeterlidir yani 0, ancak hatalı calıstıgında birden cok hata dan dolayı fonksiyon patlayabilir, bu hataları temsil etmek icin farklı sayılar kullanmanız gerekir. Bundan dolayı genelde 0 dogruyu , geriye donen farklı negatif degerlerde sizin kodunuzun neden patladıgını gosterir. Ben boyle yorumladım bugune kadar
|
|
Yazar |
|
barbi
istanbul
Kayıt: 24.01.2006 |
|
Büyük ihtimalle bi yerde basit bi hata var ama iki saattir ona bakıyorum bulamıyorum. kod da biraz uzadı artık(1000 satır kadar) herşey birbiri ile bağlantılı
Fonk.ların geri dönüş değerleri -1. ama dizide de sorun yok. diziyide yazdırdım dosya ismi ile aynı. zaten dosyayı ilk açarken de aynı dizi ismini kullandım. şu şekilde :
f = fopen(path, "r");
tempfile = fopen("temp.txt","w");
/* kopyalam işlemi burayı başarıyla yapıyor*/
fclose(f);
fclose(tempfile);
remove(path);
rename("temp.txt", path);
.....
people pray for strength, and guidance; they should pray for the mercy of a swift death...
|
|
Yazar |
|
tarikkranda
Kayıt: 07.01.2006 |
|
barbi yazdi | Büyük ihtimalle bi yerde basit bi hata var ama iki saattir ona bakıyorum bulamıyorum. kod da biraz uzadı artık(1000 satır kadar) herşey birbiri ile bağlantılı
Fonk.ların geri dönüş değerleri -1. ama dizide de sorun yok. diziyide yazdırdım dosya ismi ile aynı. zaten dosyayı ilk açarken de aynı dizi ismini kullandım. şu şekilde :
f = fopen(path, "r");
tempfile = fopen("temp.txt","w");
/* kopyalam işlemi burayı başarıyla yapıyor*/
fclose(f);
fclose(tempfile);
remove(path);
rename("temp.txt", path);
.....
|
yaw ne diyecegimi bilemiyorum, kodu gormeden tum tahminlerimi yaptım ama istersen kodu gonder bi de en bakayım, islem yapılcak dosyaları da eklersen gonderirken iyi olur, mailim tarikkranda@gmail.com. Umarım yardımcı olabilrim zamanım olursa yeterli
|
|
Yazar |
|
barbi
istanbul
Kayıt: 24.01.2006 |
|
Tarık gerçekten sağolasın. Az önce sana kodu gönderebilmek için sorun olan kısımları ayrı bir C dosyasına kopyaladım. gereksiz kontrolleri çıkardım anlaşılsın diye kod çalıştı bi yerde dosyanın olup olmadığının yada boş olup olmadığının kontrolünü yapmıştım. orada dolu olması şartında fclose() yapmayı unutmuşum açık bir dosyayı aynı dosya modunda tekrar aömaya çalışınca hata vermiyor sanırım. Ama iş kapatmaya gelince sorun oldu
Yardımlar için sağolun herkese kolay gele
people pray for strength, and guidance; they should pray for the mercy of a swift death...
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | | | | |