Network üstünde çalışmayan Assignfile reset

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
fatihbarut
Üye
Mesajlar: 392
Kayıt: 15 Ara 2011 08:02

Network üstünde çalışmayan Assignfile reset

Mesaj gönderen fatihbarut » 23 Oca 2018 04:30

Arkadaşlar readonly bir network klasöründe bulunan bir dosyayı AssignFile Reset ile açmaya çalıştığımda access denied hatası alıyorum.
nedendir acaba?

ertank
Üye
Mesajlar: 982
Kayıt: 11 Eyl 2015 11:45

Re: Network üstünde çalışmayan Assignfile reset

Mesaj gönderen ertank » 24 Oca 2018 04:42

Merhaba,

Reset() fonksiyonu standart olarak dosyayı Okuma/Yazma modunda açar. Sizin yazma yetkiniz olmadığı için hata almanız mümkün. Sadece okunur şekilde dosya açmak istiyorsanız global FileMode değişkenini Reset() prosedürünü çağırmadan önce sadece okunur şekilde ayarlamalısınız.

Kod: Tümünü seç

var
  F: TextFile;
begin
  AssignFile('\\sunucu\dizin\dosya.txt');
  FileMode := fmOpenRead;
  Reset(F);
end;

fatihbarut
Üye
Mesajlar: 392
Kayıt: 15 Ara 2011 08:02

Re: Network üstünde çalışmayan Assignfile reset

Mesaj gönderen fatihbarut » 24 Oca 2018 08:26

Ertan Bey teşekkürler,
Her yerde Reset readonly açar dedikleri için filemode'u ayarlamak aklıma bile gelmedi, tekrar teşekkürler.

fatihbarut
Üye
Mesajlar: 392
Kayıt: 15 Ara 2011 08:02

Re: Network üstünde çalışmayan Assignfile reset

Mesaj gönderen fatihbarut » 24 Oca 2018 08:40

Bir şey daha sorayım.
Bir dosyanın kopyalanması sırasında tahmini kalan süre nasıl bulunur?
Zira aşağıdaki kod doğru hesaplamıyor mutlaka bir süre fazla kalıyor

Kod: Tümünü seç

Function TForm1.CopyFileWithProgressBar1(Source, Destination: string): string;
var
  FromF, ToF: file of byte;
  Buffer: array [0 .. 4096] of char;
  NumRead: integer;
  FileLength: longint;
  t1, t2: DWORD;
  maxi: integer;
begin
  AssignFile(FromF, Source);
  FileMode := fmOpenRead;
  reset(FromF);
  AssignFile(ToF, Destination);
  rewrite(ToF);
  FileLength := FileSize(FromF);
  with sProgressBar1 do
  begin
    Min := 0;
    Max := FileLength;
    t1 := timegettime;
    maxi := Max div 4096;
    while FileLength > 0 do
    begin
      BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF, Buffer[0], NumRead);
      t2 := timegettime;
      Min := Min + 1;
      // Show the time in Label1
      TahminiKalanSureL.caption := FormatFloat('00', ((t2 - t1) / Min * maxi - t2 + t1) / 100);
      Application.ProcessMessages;
      Position := Position + NumRead;
    end;
    CloseFile(FromF);
    CloseFile(ToF);
  end;
end;

ertank
Üye
Mesajlar: 982
Kayıt: 11 Eyl 2015 11:45

Re: Network üstünde çalışmayan Assignfile reset

Mesaj gönderen ertank » 25 Oca 2018 07:47

Daha önce forumda ShellApi ile klasör silme örneği verilmişti
viewtopic.php?f=2&t=9902&p=197665&p197661#p197661

Bu örnek aşağıdaki şekilde genişletilebilir:

Kod: Tümünü seç

procedure CopyFolder(const AHandle: HWND; const Source, Destination: string);
var
  ShOp: TSHFileOpStruct;
begin
  ShOp.Wnd := AHandle;
  ShOp.wFunc := FO_COPY;
  ShOp.pFrom := PChar(Source + #0);
  ShOp.pTo := PChar(Destination + #0);
  ShOp.fFlags := FOF_SIMPLEPROGRESS;
  SHFileOperation(ShOp);
end;
Kullanımı şöyle olacaktır:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFolder(Self.Handle, 'C:\temp\temp.rar', 'C:\temp\tempnew.rar');
end;
Parametre olarak klasör adı da verilebilir. Alternatif kullanım şekilleri için fFlags parametresinin alabileceği değerleri (FOF_ ile başlayan sabit tanımlar) inceleyebilirsiniz.

Cevapla