Sistem Programlama - Dosya Kopyalama Islemleri
- Sevdanur GENC

- Mar 4, 2012
- 3 min read
Windows giris / cikis (I/O) islemlerini kullanacagimiz uygulamalarimizda dosyalarin iceriklerinin ve kendilerinin kopyalanmasini sagliyor olacagiz.
Makale iceriginde inceleyecegimiz uygulamala konulari ;
C kutuphaneleri kullanilarak dosya kopyalama,
Windows ile dosya kopyalama,
Windows Convenience Fonksiyonu ile kopyalama.
C Kutuphaneleri Kullanilarak Dosya Kopyalama ;
Var olan bir dosyanin icerigini baska bir dosya icerigine kopyalayabilmemiz icin gerceklestirmemiz gereken islemlerden bahsedecek olursak; oncelikle kopyalamak icin icerigini alacagimiz dosyanin acilmasini ve iceriginin okunmasi icin gerekli komutlari yazmamiz gerekiyor. Eger kullanici yanlis bir kod dizimi yazdiysa uyari mesaji verilecektir. Ve yine kullanici komudu nasil kullanacagini bilmiyorsa komut satirina sadece komutu yazmasi yeterli olacaktir, hemen ardindan kullaniciya uyari mesaji verilecektir.
fopen; windows i/o islemlerinde dosyalar icerisinde ozel karakteri okutabilmemiz icin bu komuta ihtiyacimiz vardir.
perror; olusabilecek hatalarin kodlarini geri dondurmesi icin kullanilir.
fread & fwrite; dosya iceriklerini okuyup yazdirabilen komutlardir.
fclose; windows i/o islemlerimizi tamamladiktan sonra dosyamizi kapatabilmemiz icin gerekli komuttur.
Iki tane metin belgesi olusturuyorum. Iceriklerine herhangi bir bilgi yazdiktan sonra kaydediyorum. Ve asagidaki kodlarla birlikte programimi derledigimizde a.txt metin belgesinin b.txt metin belgesi ile icerigini birebir degistirecegiz.
FileCopyWithC.Cpp Kaynak Kodu ;
#include <stdio.h> #include <errno.h> #define BUF_SIZE 256 int main(int argc, char *argv[]) { FILE *inFile, *outFile; char rec
; size_t bytesIn, bytesOut; if (argc !=3) { printf("Dosya Kopyalamada Yazmaniz Gereken Kod Dizimi; FileCopyWithC file1 file2 \n"); return 1; } inFile = fopen(argv<1>
, "rb"); if (inFile==NULL) { perror(argv<1>
); return 2; } outFile = fopen(argv<2>
, "wb"); if(outFile==NULL) { perror(argv<2>
);
return 3;
}
while ((bytesIn = fread(rec,1,BUF_SIZE,inFile))>0)
{
bytesOut = fwrite(rec,1,bytesIn,outFile);
if(bytesOut != bytesIn)
{
perror("Komut Dizim Yazim Hatasi Bulunmaktadir...");
return 4;
}
}
fclose(inFile);
fclose(outFile);
return 0;
}
Programin Ekran Ciktisi ;
Uygulamamizi calistirabilmemiz de bize yardimci olacak command line penceresi ile calisiyoruz. Oncelikle normal dos komutu olan comp ile her iki dosyamida karsilastiriyoruz. Verilen sonuclarda iceriklerinin ayni olmadigina dair hata mesaji verdikten sonra baska bir karsilastirma yapip yapmayacagimizi soruyor. Peki dosyayi kopyalabilmemiz icin komutumuzu nasil kullanabiliriz. Komut dosyamiza verdigimiz ismi kullaniyoruz ve komut satirina FileCopyWithC yaziyoruz. Program icerisinde bu komutun nasil kullanilacagina dair mesaji belirtmistik. Simdi FileCopyWithC a.txt b.txt komutunu vererek a metin belgesinin icerigini b metin belgesinin icerigine kopyalamis oluyoruz. Tekrardan Comp komutu ile bu iki dosyayi kiyaslattirdigimiz zaman karsilastirmanin tamamlandigini ve dosyalarin birbiri ile eslestigini kullaniciya bildirmektedir.
Windows Ile Dosya Kopyalama ;
Windows.h kutuphanesinin gerekliliginden onceki makalemde de bahsetmistim. Icerisinde barindirdigi fonksiyonlar ve veri tipleri bizim yazacagimiz programlar icin gerekli olacaktir. Windows.h kutuphanesinin gerekliliginden bahsettikten sonra onemli bir veri tipi olan HANDLE ifadesi karsimiza cikiyor. Peki nedir bu handle kavrami...
HANDLE;HANDLE;
Kelime anlami olarak isleyici, tutucu, cozucu, tanitici gibi kullanilmaktadir. Programlarimizda pointer'lara veya degiskenlere ihtiyac duyariz. Bir islemi bircok defa kullanacaksak eger bu aldigimiz pointer yada degiskenleri handle kullanariz ve islemleri tekrar tekrar cagirmak zorunda kalmayiz. Bir bakima olusturdugumuz nesnelere erisim icin kullanacagimiz bir tutucu komut olarakda dusunebiliriz.
Invalid_Handle_Value & Generic_Read ; Yazacagimiz programda, Invalid_Handle_Value ve Generic_Read komutlarida kullanilmaktadir. Bunlar, windows tarafindan tanimlanmis cesitli sembolik sabitler ve degiskenlere ornekdir. Onceki makalede de bahsettigimiz gibi isimleri uzun ve genellikle yaptiklari islemlere gore isimlendirilir.
GetLastError; Sistemde olusan hata kodlarini yakalayip bunlari hata mesajlarina donusturen ve kullaniciya gosteren komuttur.
CreateFile; Dosyayi olusturmamiz icin gerekli zengin icerilikli bir fonksiyon komutudur.
FileCopyWithWindows.Cpp Kaynak Kodu ;
#include <windows.h> #include <stdio.h> #define BUF_SIZE 256 int main(int argc, LPTSTR argv[]) { HANDLE hIn, hOut; DWORD nIn, nOut; CHAR buffer
; if(argc!=3) { printf("dosya kopyalamanin kullanimi ; FileCopyWithWindows file1 file2 \n"); return 1; } hIn = CreateFile(argv<1>
, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hIn==INVALID_HANDLE_VALUE) { printf("Girdi Dosyasi Acilamiyor. Hata ; %x\n", GetLastError()); return 2; } hOut = CreateFile(argv<2>
, GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hOut==INVALID_HANDLE_VALUE)
{
printf("Girdi Dosyasi Acilamiyor. Hata ; %x\n", GetLastError());
return 3;
}
while (ReadFile(hIn,buffer,BUF_SIZE,&nIn,NULL)&&nIn > 0 )
{
WriteFile(hOut,buffer,nIn,&nOut,NULL);
if (nIn != nOut)
{
printf("Komut Dizim Yazim Hatasi Bulunmaktadir... ; %x\n", GetLastError());
return 4;
}
CloseHandle(hIn);
CloseHandle(hOut);
return 0;
}
}
Programin Ekran Ciktisi ;
Windows Convenience Fonksiyonu Ile Kopyalama ;
Windows'un kolay kullanilabilir bu fonksiyon ile dosyamizin icerigi ile birlikte tekrardan yeni bir dosya seklinde kopyalayarak, yeniden uretebilecegiz. Windows'un CopyFile komutunu kullanmamiz yeterli olacaktir.
FileCopyWithWinCon.Cpp Kaynak Kodu ;
#include <windows.h> #include <stdio.h> int main(int argc, LPTSTR argv[]) { if(argc!=3) { printf("dosya kopyalamanin kullanimi ; FileCopyWithWinCon file1 file2 \n"); return 1; } if (!CopyFile(argv<1>
, argv<2>
, FALSE))
{
printf("Dosya Kopyalama Hatasi ; %x\n", GetLastError());
return 2;
}
return 0;
}
Comments