18 Şubat 2012, 23:57
#1 Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
C ile dosya arama
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
Bu yazıda, windows.h kütüphanesinin bazı fonksiyonları kullanılarak dizinlerde dolaşıp dosya arama ve istenirse dosyayı açma işlemlerini yapan C kodlarını paylaşacağım.Henüz beta aşamasındaki uygulamanın c kodları aşağıdaki gibidir. Bu konuyla ilgili çalışması olan arkadaşlar için faydalı olacağını düşünüyorum. Genel olarak windows.h da tanımlı olan WIN32_FIND_DATA yapısı kullanıldığı için bu yapıdan biraz bahsedelim. Bu yapıdaki bir değişken için, dosyanın adı yolu oluşturulma tarihi gibi bilgilere erişilebilir. Yapının içeriği aşağıdaki gibidir. Not: Exe nin bulunduğu dizinde arama yapmak için ‘.’ karakteri kullanılır ör:dosya yolu ./Music Kod: Kodu kopyalamak için üzerine çift tıklayın!
typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[MAX_PATH]; TCHAR cAlternateFileName[14]; }
Geliştirilebilir(Büyük küçük harf ayrımı yapma farklı arama algoritmaları düzenleme vs.) yapıdaki kodlar aşağıda yer almaktadır. Kod: Kodu kopyalamak için üzerine çift tıklayın!
#include<windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
#include <dirent.h>
int sayac=0;//dosya sayısını tutar
char aranan_kelime[50]="";
void dosyaRun(char []);//system komutu ile doosyanın çalıştırılması
bool klasorKontrol(char*);//klasörmü yoksa dosyamı kontrolü
void strSifirla(char[]);//string sıfırlama fonksiyonu
void strAra(char[],char []);//string arama fonksiyonu
void agac(char* );//dizin gezme fonksiyonu
bool klasorKontrol(char* adres)//belirtilen yolun klasör olup olmadığını kontrol eder
{
int length;
length=strlen(adres);
DIR *d;
d=opendir(adres);//eğer açılmaya çalışılan yol klasör ise d doğru bir değer döner
if(d)
{
closedir(d);
return false;
}
else return true;
}
void strSifirla(char kar[])//string sıfırlaması yapan fonksiyon
{
int uzunluk=strlen(kar)+3;
for(int i=0;i<=uzunluk;i++)
kar[i]='\0';
}
void strAra(char yol[MAX_PATH],char dosya[MAX_PATH])//yol değişkeni içinde girilen katarın olup olmadığını kontrol eder
{
char deg[MAX_PATH]="";
int j=0;
for(int i=0;i<strlen(yol);i++)
{
for(int j=i;j<strlen(yol);j++)
{
int ksayac=0;
for(int k=i;k<=j;k++)
{
deg[ksayac]=yol[k];
ksayac++;
}
if(strcmp(deg,aranan_kelime)==0)//eğer kelime bulunursa
{
printf("\ndosya bulundu...\n%s\n acilsin mi e/h?",yol);
char ch=getch();
if(ch=='e' || ch=='E')
dosyaRun(dosya);
printf("\naranıyor...\n");
return;
}
strSifirla(deg);
}
}
}
void dosyaRun(char dosya[MAX_PATH])//system("") komutu ile yoldaki dosyanın açılmasını sağlar
{
int i;
char runDosya[MAX_PATH];
runDosya[0]='"';
for(i=0;i<strlen(dosya);i++)
{
runDosya[i+1]=dosya[i];
}
runDosya[i+1]='"';
runDosya[i+2]='\0';
system(runDosya);
}
void agac(char* yol)//dizin tarama islemi bu fonksiyonla yapilir
{
char aranan[MAX_PATH],sonraki[MAX_PATH];
bool sonuc=true;
WIN32_FIND_DATA dbilgi;
HANDLE dDir;
sprintf(aranan,"%s\\*.*",yol);
dDir=FindFirstFile(aranan,&dbilgi);
if (dDir == INVALID_HANDLE_VALUE)
return;
while(sonuc)
{
if (!strcmp(dbilgi.cFileName, ".")) //eğer nokta ile karşılaşılmaışsa
{
FindNextFile(dDir, &dbilgi); //sonraki dosyayı bul
sonuc = FindNextFile(dDir, &dbilgi);
continue;
}
sprintf(sonraki, "%s\\%s", yol, dbilgi.cFileName);
if(klasorKontrol(sonraki))// sıradaki yol klasör den farklı ise
{
char yoll[255];
sayac++;
strAra(dbilgi.cFileName,sonraki);
}
if (dbilgi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
agac(sonraki);//rekürsif yapı ile fonksiyon yeniden çağrılıyor ve bir sonraki dizindeki elemanı aramak için sonraki yolu fonksiyona gönderiliyor
sonuc = FindNextFile(dDir, &dbilgi);
}
FindClose(dDir);
}
main()
{
char yol[MAX_PATH];
printf("dosya yolu :");
gets(yol);
printf("aranan kelime :");
gets(aranan_kelime);
printf("\naraniyor...\n");
agac(yol);
printf("arama bitti...%d dosya arandi...",sayac);
getch();
}
__________________ Doğruları biliyorsan, yalanları dinlemek eğlencelidir.