Dosya Transferi İle İlgili

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Misafir

Dosya Transferi İle İlgili

Mesaj gönderen Misafir »

Dosya transferi ile ilgili internetten bir kod buldum.kod çalışıyor ama bi sıkıntı var.program gelen dosyayı c:\ içerisine txt olarak kaydediyor. gönderilen normal dosyayı txt olarak görüyorum.bu txt dosyasını normal gönderilen dosya formatına çevirmek mümkünmüdür?

kod şu şekilde...

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FileCtrl, StdCtrls, Gauges, ScktComp;

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Gauge1: TGauge;
    FileListBox1: TFileListBox;
    DirectoryListBox1: TDirectoryListBox;
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const bufsize=512;
      crlf=#13#10;

var
  Form1: TForm1;
  fSrc,fDst,len: Integer;
  size: Longint;
  buffer: packed array [0..bufsize-1] of byte;
  sendfilegate1:boolean;
  kapat:boolean;
  stopped:boolean;
  stepped:integer;


implementation

{$R *.dfm}

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var dta:string;
begin
len:=socket.ReceiveBuf(buffer,bufsize);
FileWrite(fDst,buffer,len);
memo1.lines.add('bufBYTE='+inttostr(len));
//pong iste, sonraki veri için
socket.SendText('pong1'+#13#10);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
fDst := FileCreate('c:\deneme.txt');

end;

procedure TForm1.Button1Click(Sender: TObject);
var x:string;
        size,fsize,bytesent:longint;
        fsrc,len:integer;

begin
clientsocket1.Active :=true;
stepped:=0;
if filelistbox1.ItemIndex=-1 then
        begin
        memo1.lines.add('dosya seç');
        exit;
        end;
x:=directorylistbox1.Directory+'\'+filelistbox1.items[filelistbox1.itemindex];
memo1.lines.add(x);

if clientsocket1.Socket.Connected=false then
        begin
        memo1.lines.add('bağlantı yok?');
        exit;
        end;

fSrc := FileOpen(x,fmOpenRead);

fsize := FileSeek(fSrc,0,2);
FileSeek(fSrc,0,0);//başa konumlan
gauge1.MaxValue:=fsize;

memo1.lines.add(inttostr(fsize)+' byte...');

memo1.lines.add('dosya göndeirliyor...');
sendfilegate1:=true;
bytesent:=0;
size:=fsize;
stopped:=false;

while size>0 do
begin
if kapat then break;
application.ProcessMessages;
if (sendfilegate1) and (stopped=false) then//ping-pong
        begin
        len := FileRead(fSrc,buffer,sizeof(buffer));
        memo1.lines.add(inttostr(len));
        clientsocket1.Socket.SendBuf(buffer,len);
        gauge1.Progress:=bytesent;
        bytesent:=bytesent+len;
        size:=size-len;
        sendfilegate1:=false;//pong iste
        end;
end;
fileclose(fsrc);
memo1.lines.add('upload ok');
gauge1.Progress:=0;
end;


procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var dta:string;
begin
dta:=trim(socket.receivetext);
inc(stepped);
form1.Caption:=dta+'/'+inttostr(length(dta))+'='+inttostr(stepped);
if dta='pong1' then sendfilegate1:=true;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
FileClose(fDst);
close;
end;

end.
delphikursu
Üye
Mesajlar: 99
Kayıt: 24 Tem 2004 05:13
Konum: kayseri
İletişim:

Mesaj gönderen delphikursu »

arkadaşım bunu en kısa yolu şudur

copyfile('c:\aa.exe','d:\',false);

olarak kopyalamaktır

bu ne txt dosyası yazar nede işlem fazlalığı ile uraşarak zaman kaybetirir

Hayırlı Günler

:)
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

ben de bu sorunun cevabını savedialog başlığı altında aramıştım ama buna yapabileceğin en pratik iş

Kod: Tümünü seç

fDst := FileCreate('c:\deneme.txt');
yerine

Kod: Tümünü seç

SaveDialogBox1.execute; //Tabii ki forma bi savedialogbox eklemelisin
fDst := FileCreate(SaveDialogBox1.filename);
ama biraz zorlamak istiyorsan indireceğin dosyanın ilk satırını okutup ona göre yorum yaptırabilirsin... Bence bu iş için Arama'ya bak ben bu tip çok örnek gördüm de (savedialog - opendialog - POS falan diye arat)
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

Merak ettim sen bu soruyu sorarken dosyayı tcp/ip gibi bir protokol yardımıyla internetten mi transfer edeceksin? çünkü verilen cevaplar dosya kaydetme ile ilgili cevaplar sen tam olarak neyi sordun. Bu arada socket.sendtext metodu yerine socket.sendstream/ socket.sendbuf (kullandığın bileşene ve işini görecek olana göre) metodlarını kullanmalısın. Tabi eğer doğru anladıysam
Misafir

Mesaj gönderen Misafir »

Bu program network üzerinde dosya transferi ile ilgili bir program.kod mantıklı ve çalışıyor gibi gözüküyor.ama dediğim gibi hangi dosya transfer edilirse edilsin c:\ içerisine deneme.txt olarak dosyayı atıyor.Deneme.txt ile gönderilen dosyanın büyüklüğü aynı.ama uzantısı txt olduğundan alınan xls dosyası veya doc dosyası bile olsa açılmıyor.problem kısaca bu şekilde..
P206
Kıdemli Üye
Mesajlar: 395
Kayıt: 17 Haz 2003 12:36
Konum: İstanbul

Mesaj gönderen P206 »

Dosya gönderme işlemi başlamadan dosyanın adını socket ile gönder.
Dosya alma işlemi bittikten sonra

Kod: Tümünü seç

RenameFile()
ile adını deneme.txt den karşı taraftan gönderilen ada çavirebilirsin.
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

o zaman ilk başta karşı tarafa sendtext metodu ile dosya adını yolla. Karşı taraf gelen bu dosya adına göre dosyayı oluşturur. Yani yazdığın programı iki aşamalı yapmalısın. sendtext ve Receievetext kısmını iki aşamalı yap önce yollanacak dosya adını yollasın sonra da dosyanın kendisini oluştursun
Misafir

Mesaj gönderen Misafir »

Gelen dosyalar..

Kod: Tümünü seç


ĞÏà¡±á                >  şÿ	               -          şÿÿÿ    
şÿÿÿ    ,   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ	   Í Á€    á  °Á    â   \ p   
meteor                                                                                                       B  °a   À  =    œ               ¯ 
  ¼   =  hÿ M:Ò8      X@        "       ·   Ú    1 " È   ÿ    ¢ 	A r i a l   T u r 1 " È   ÿ    ¢ 	A r i a l   T u r 1 " È   ÿ    ¢ 	A r i a l   T u r 1 " È   ÿ    ¢ 
	A r i a l   T u r 1 "     ÿ    ¢ 	A r i a l   T u r 
    #,##0\ "TL";\-#,##0\ "TL"#    #,##0\ "TL";[Red]\-#,##0\ "TL"$     #,##0.00\ "TL";\-#,##0.00\ "TL")  $  
#,##0.00\ "TL";[Red]\-#,##0.00\ "TL"> * 9  _-* #,##0\ "TL"_-;\-* #,##0\ "TL"_-;_-* "-"\ "TL"_-;_-@_-> ) 9  _-* #,##0\ _T_L_-;\-* #,##0\ _T_L_-;_-* "-"\ _T_L_-;_-@_-F , A  _-* #,##0.00\ "TL"_-;\-* #,##0.00\ "TL"_-;_-* "-"??\ "TL"_-;_-@_-F + A  _-* #,##0.00\ _T_L_-
;\-* #,##0.00\ _T_L_-;_-* "-"??\ _T_L_-;_-@_-à      õÿ            À à  
   õÿ   ô        À à     õÿ   ô        À à     õÿ   ô        À à     õÿ  
 ô        À à      õÿ   ô        À à      õÿ   ô        À à      õÿ   ô        À à      õÿ   ô        À à      õÿ   ô        À à      õÿ   ô        À à      õÿ   ô        À à      õÿ   ô        À à      õÿ   ô        À à      õÿ   ô        À à 
                  À à   + õÿ   ø        À à   ) õÿ   ø        À à   , 
õÿ   ø        À à   * õÿ   ø        À à   	 õÿ   ø        À à           @ @   À “ €ÿ“ €ÿ“  € ÿ“ €ÿ“ € ÿ“ 
€ÿ`   …        Sayfa1…  Ï5     Sayfa2…  Ö6     Sayfa3Œ  Z Z Á Á  T ü İ Y        Dönem   Telefon
 B u l u n d u u   Y e r 

şeklinde.notepad ile açılıyor.dosya ismini veya uzantısını orjinal ismi ve uzantısı ile değiştirme problemi çözmedi.
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

Peki dosynın bağlantılı olduğu uygulama ile açılıyormu? örn excel :) eğer açılmıyorsa boyutlarını kontrol et. gönderilmeden önceki boyutuyla gönderildikten sonraki boyutları eşitmi? eğer fastnet bileşenlerini kullanıyorsan bildiğim kadarıyla onlar sınırlı uzunlukta transfer yapabiliyorlar.
Misafir

Mesaj gönderen Misafir »

gönderilen ve alınan dosyaların dosya boyutu tamamiyle aynı.txt olan dosya değiştirildiğinde mesela excel dosyası ise uzantısını xls yaptığımda excel bu dosyayı açamıyor.dosyayı açma problemi de var.
Farklı yöntemler hakkında fikri olan arkadaşlardan yardım bekliyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhabalar...

- Vaktim olmadığı için kodu deneyemedim.

- Önerim; NotePad (bildiğimiz standart Windows Not defteri) ile hazırlayacağın (içerisinde birbirini takip eden harf/rakam olmayan şekildeyse daha faydalı olur) bir text dosyasını gönderip/alarak, oluşan farklılığı tespit ederseniz çözüm için faydalı olur...

- Bu şekilde transfer sırasında eksik/fazla ne varsa görünür kılınır...

- Kolay gelsin...
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Tekrar merhaba... :wink:

- Kodunu deneme fırsatı buldum... Aslında dediğin gibi değil, sorunsuz çalışıyormuş... Sadece dosya tipini belirleyen uzantısını değiştirmeyi başaramamışsın... :oops:

- Kodunda ufak bir değişiklik yaparsan okuduğun dosya adını C:\ dizinine aynen aktarılmasını sağlayabilirsin... Hatta boş bir klasör verirsen gelen dosya hangisiydi diye karıştırmazsın...

:idea: - FormCreate olayındaki ...

Kod: Tümünü seç

fDst := FileCreate('c:\deneme.txt'); 
... satırını silmeyi ihmal etme!

Kod: Tümünü seç

  // Buraya 'or fmShareDenyNone' ibaresi eklenerek
  // çalışmakta olan dosyaları da transfer edilebilir yapıyoruz.
  fSrc := FileOpen(x, fmOpenRead or fmShareDenyNone);
  // Burada fDst yani hedef dosya ismi ve tipi kaynak dosya ile aynı oldu...
  fDst := FileCreate('C:\' + ExtractFileName(x));
- Başarılar...
Resim
Resim ....Resim
Kullanıcı avatarı
derya
Kıdemli Üye
Mesajlar: 68
Kayıt: 16 May 2004 02:43
Konum: Almanya/Bonn
İletişim:

Mesaj gönderen derya »

Ben kodunuzu denemedim, ama buffer'i pointer olarak kullanırsanız nasıl olur?
Ben Client-Server Socketle dosya göndermek için böyle bir kod kullandıyorum:

Kod: Tümünü seç

unit unit1;

interface 

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ScktComp, StdCtrls; 

type 
  TForm1 = class(TForm) 
    ClientSocket1: TClientSocket; 
    ServerSocket1: TServerSocket; 
    btnTestSockets: TButton; 
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure ClientSocket1Disconnect(Sender: TObject; 
      Socket: TCustomWinSocket);
    procedure ClientSocket1Connect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    procedure ServerSocket1ClientConnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    procedure btnTestSocketsClick(Sender: TObject);

  private 
    FStream: TFileStream; 
    { Private-Deklarationen } 
  public 
    { Public-Deklarationen }
  end; 

var
  Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.ClientSocket1Read(Sender: TObject; 
  Socket: TCustomWinSocket); 
var 
  iLen: Integer;
  Bfr: Pointer; 
begin 
  iLen := Socket.ReceiveLength; 
  GetMem(Bfr, iLen);
  try
    Socket.ReceiveBuf(Bfr^, iLen);
    FStream.Write(Bfr^, iLen);
  finally
    FreeMem(Bfr); 
  end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  FStream := nil; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  if Assigned(FStream) then 
  begin 
    FStream.Free; 
    FStream := nil; 
  end; 
end; 

procedure TForm1.ClientSocket1Disconnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  if Assigned(FStream) then 
  begin 
    FStream.Free; 
    FStream := nil; 
  end; 
end; 

procedure TForm1.ClientSocket1Connect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin
  FStream := TFileStream.Create('c:\gelen\dosya.ext', fmCreate or fmShareDenyWrite);
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket); 
begin
  Socket.SendStream(TFileStream.Create('F:\yolanınlan\dosya.ext', fmOpenRead or fmShareDenyWrite));
end;

procedure TForm1.btnTestSocketsClick(Sender: TObject);
begin
  ServerSocket1.Active := True;
  ClientSocket1.Active := True;
end; 

end.
Belki işinize yarar.
Kullanıcı avatarı
cuneyt22
Üye
Mesajlar: 213
Kayıt: 07 Şub 2004 03:32
İletişim:

Mesaj gönderen cuneyt22 »

s.a
arkadaslar ben yukardaki ornegi calistirdim ancak herhangi bir veri gitmiyor..
herhangi bir hatada vermiyor..boyutu kucuk olan bir veri gonderiyorum 'uploap ok' diyor hersey yolunda gidiyor ancak ben deneme.txt dosyasini actigimda ici bombos boyutuda 0 bunun sebebi ne olabilir acaba...iyi calismalar
Kullanıcı avatarı
cuneyt22
Üye
Mesajlar: 213
Kayıt: 07 Şub 2004 03:32
İletişim:

Mesaj gönderen cuneyt22 »

unutmadan variant bilesinini ekleyemiyorum variant.dcu hatasi veriyor bende onu cikardim..calisti ama dosyayi gonderdim diyor actigimda gondermemis..
Cevapla