Tam Sürümünü Görmek İçin : dosya adı değiştirme io.h
merhaba arkadaşlar;
sorunum şu:
şimdi io.h kütüphanesini kullanarak bir dizini taratıyorum. io.h içindeki bir struct yapısının içine sırası ile dosya bilgileri atılıyor _findfirst ve _findnext fonksiyonları ile. daha sonra onları ekrana yazdırıyorum. merak ettiğim ise acaba hangi fonksiyon sayesinde bu dosyanın bilgilerini(isim vb.) değiştirebiliriz.
yardım edeceğinizi umuyorum. teşekkürler.
#include <stdio.h>
#include <io.h>
#include <string.h>
int main()
{
struct _finddata_t dosyamiz;
int sonuc;
char dosya_yolu[80]="C:\\aa\\*.mp3";
sonuc=_findfirst(dosya_yolu,&dosyamiz);
printf("%-20s--%-ld\n",dosyamiz.name,dosyamiz.size);
while (!_findnext(sonuc,&dosyamiz))
{
printf("%-20s--%-ld\n",dosyamiz.name,dosyamiz.size);
rename(dosya_yolu,"asdsad");
}
system("pause");
}
acehreli
17/05/2007, 02:00
Isin bitince _findclose'u cagirmazsan kaynak sizintisi oluyormus.
Sorunu tam anlamiyorum cunku zaten 'rename'i kullaniyorsun. O ise yaramiyor mu? Eger oyleyse rename'in dOndUrdugu degeri denetlemek bir ipucu verebilir. Hata olursa sifirdan farkli deger dOndUruyormus. Sonra errno'ya da bakarsin...
Ali
x1bx00x0a
17/05/2007, 03:07
Muhtemel hata rename fonksiyonunun hatalı kullanılmasıdır.
rename fonksiyonunun ilk argumanı değiştireceği dosya adıdır, diğeri ise yeni ad...
rename(const char *old_name, const char *new_name);
rename("degistir_beni.ext", "degistirdim_seni.ext");
acehreli
17/05/2007, 03:37
Yani soyle demesi gerekiyormus:
rename(dosyamiz.name, "asdsad");
Ali
Yanlis gordugum yerleri ve daha uygun oldugunu dusundugum yerleri asagida belirttim ayrica yanlis hatirlamiyorsam rename fonksiyonunun calismasi icin dosyalarla ayni klasor icinde olmaniz gerekiyor. Bu yuzden programinizi derledikten sonra exe dosyasini "C:\\aa" klasorune kopyalayip bir dos penceresinden calistirirsaniz arzu ettiginiz sonucu almaniz lazim.
Elbette programinizi surekli klasorden klasore kopyalamak istemiyorsunuzdur. O yuzden asagidaki hali ile test ettikten sonra programiniza bir iki satir daha ekleyip ilk olarak current directory nuzu "c:\\aa" veya hangi klasor icerisinde arama yapacaksaniz ona degistirmenizde fayda var.
#include <stdio.h>
#include <io.h>
#include <string.h>
#include <stdlib.h> // _MAX_FNAME icin eklendi.
int main()
{
struct _finddata_t dosyamiz;
int sonuc;
int i=0; // Birden fazla dosya ismi bulunursa kullanmak uzere.
char szYeniIsim[_MAX_FNAME]; // Yeni dosya ismi icin buffer.
char dosya_yolu[80]="C:\\aa\\*.mp3";
sonuc=_findfirst(dosya_yolu,&dosyamiz);
// sonuc degiskeninin degeri mutlaka test edilmeli. Aksi takdirde aranan
// dosya turu bulunmazsa hataya yol acacaktir.
// (!_findnext(sonuc,&dosyamiz)) hataya yol acacaktir.
// Asagidakine benzer bir seyler olabilir.
// If (sonuc == -1) {
// printf("%s", "Aranilan dosya turu bulunamadi!");
// return 0; }
// Program buraya kadar geldi ise en azindan bir dosya bulundu.
// Asagidaki gibi bir isimlendirme teknigi kullanmanizi tavsiye ederim.
// Bu sayede dosya uzantilarini degistirmenin yaratabilecegi sorunlarin
// onune gecmis olursunuz ayrica birden fazla dosya ismi degistirmek
// gerektiginde asdsad0.mp3, ..., asdsadN.mp3 seklinde isimler kullanilmis
// olacagindan sorun yasamazsiniz.
sprintf (szYeniIsim, "%s%i%s", "asdsad", i++, ".mp3");
printf("%-20s--%-ld\n",dosyamiz.name,dosyamiz.size);
// Bulunan ilk dosyanin ismini atliyorsunuz.
rename(dosyamiz.name, szYeniIsim); //Bulunan ilk dosya burda isimlendirilebilir.
while (!_findnext(sonuc,&dosyamiz))
{
printf("%-20s--%-ld\n",dosyamiz.name,dosyamiz.size);
sprintf (szYeniIsim, "%s%i%s", "asdsad", i++, ".mp3");
// rename(dosya_yolu,"asdsad"); yanlis kullanim
rename(dosyamiz.name, szYeniIsim);
}
// acehrelinin _findclose uyarisini unutma burda.
system("pause"); // Zararsiz ama gereksiz.
return 0; // Bence gerekli.
}
golgepapaz
17/05/2007, 09:55
system("pause"); // Zararsiz ama gereksiz.
ah hatta hatali, birkere isletim sistemi desteklemiyor olabilir,cagirmasi pahali, programin calistigi yerde pause.diye baska bir executable olabilir, bu executable sisteminizi formatlayabilir (pek ihtimal dahilinde degil ama), ayrica getch() ve cin.get() varken cok cok anlamsiz....
ilginize içten bir şekilde teşekkür ederim arkadaşlar. rename için çalışmamasının sebebi aslında benim rename fonksiyonuna dosyanın adını direk olarak arguman olarak gönderemememle ilgili bakınız:
struct _finddata_t
{
unsigned attrib; /* Attributes, see constants above. */
time_t time_create;
time_t time_access; /* always midnight local time */
time_t time_write;
_fsize_t size;
char name[FILENAME_MAX]; /* may include spaces. */
};
görüldüğü gibi io.h header ının içinde tanımlanan _finddata_t yapısının elemanları işaretçi olmadığı için , findfirst ve findnext fonksiyonları dosya bilgilerini dosyamız değişkenine kopyalıyor. yani herhangi bir işaretçi durumu olmadığı için dosya elimizden uçuyor. rename i oraya niyetimi belli etme amaçlı koymuştum.
ama dediğiniz gibi rename i de denedim 0 dan farklı bir değer döndürüyor. :garip:
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i=0;
struct _finddata_t dosyamiz;
int sonuc;
char dosya_yolu[80]="C:\\aa\\*.mp3";
char path[80];
char path2[80];
char buffer[80];
char sarki[10]="sarki";
sonuc=_findfirst(dosya_yolu,&dosyamiz);
printf("%s\n",dosyamiz.name);
while (!_findnext(sonuc,&dosyamiz))
{
strcpy(path,"C:\\aa\\"); // bu fonksiyonu rename de kullanacağım
strcpy(path2,"C:\\aa\\"); // bunu da
printf("%s\n",dosyamiz.name);
strcpy(sarki,"sarki ");
itoa(i,buffer,10); // sayac olan i degiskenini sarkiların adını degistirmek için kullanacagim.
// o yüzden string e ceviriyorum 10 tabanında.
strcat(sarki,buffer); // sarki stringinin yanına sayacı koyuyorum yani sarki 1, sarki 2 diye gidiyor.
strcat(sarki,".mp3"); // sarkinin sonuna .mp3 uzantısını koyuyorum ki adama benzesin
strcat(path,dosyamiz.name); //simdide rename icinde kullanmak icin
// dosya yolunun sonuna simdiki sarki adını yazıyorum
strcat(path2,sarki); // aynı dosya yolunun sonuna degistirecegim adı yazdım
rename(path,path2); // rename("C:\\aa\\Erkan Ogur - Ben Seni Sevdigimi.mp3","C:\\aa\\sarki 2.mp3")
i++;
}
_findclose(sonuc);
getch();
}
şimdilik sorun çözüldü herkese teşekkürler :hey:
acehreli
17/05/2007, 16:35
clacks, herhalde dizi adlarinin gerektiginde otomatik olarak "ilk ogelerine isaretci"ye donustugunu bilmiyorsun. _finddata_t'nin name ogesi bir char dizisi oldugu icin, 'char*' bekleyen her yerde kullanilabilir.
Yani benim rename(dosyamiz.name, "asdsad"); cozumumun ise yaramamasinin nedeni; name 'char*' olmadigi icin degil, Sabahi'nin soyledigi gibi name klasor bilgisini tutmadigi icinmis.
Ali
acehreli
17/05/2007, 16:36
Duzeltiyorum: name'in 'char*' gibi kullanildigini biliyorsun, cunku printf'e %s ile birlikte gonderiyorsun.
Ali
Ali bey,
dediğiniz doğru. bir an için unutmuşum. dediğiniz gibi klasor olayi ile ilgili bir sey. yardımlarınız için çok teşekkür ederim. şimdi bu program işe yarayacak diye soran olursa cevaplayayım.
bilgisayarımda küçük harfle başlayan dosyalar olunca özellikle mp3ler pek güzel bir görüntü vermiyor. onların ilk harflerini büyütmek için :)
while (!_findnext(sonuc,&dosyamiz))
{
printf("%s\n",dosyamiz.name);
if (dosyamiz.name[0]>=97)
{
strcpy(sarki,dosyamiz.name);
sarki[0]=sarki[0]-32;
strcpy(path,"C:aa\\");
strcpy(path2,"C:aa\\");
strcat(path,dosyamiz.name);
strcat(path2,sarki);
rename(path,path2);
sayac++;
}
}
ah hatta hatali, birkere isletim sistemi desteklemiyor olabilir,cagirmasi pahali, programin calistigi yerde pause.diye baska bir executable olabilir, bu executable sisteminizi formatlayabilir (pek ihtimal dahilinde degil ama), ayrica getch() ve cin.get() varken cok cok anlamsiz....
Bence getch() ve cin.get() gibi cagrilarda manasiz. Cunki bu noktada program calismasini sonlandirdi. Eger programin sonuna eristikten sonra pencerenin acik kalmasi isteniyorsa bunun dogru yolu programi bir konsoldan cagirmaktir.
Elbette bu programcinin kendisine kalmis illaki bizim dogru buldugumuz sekilde kod yazmak zorunda degiller.
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.