Çöp kutusuna göndermeden dizin silme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
baloglurecep
Üye
Mesajlar: 248
Kayıt: 21 Tem 2006 03:59
İletişim:

Çöp kutusuna göndermeden dizin silme

Mesaj gönderen baloglurecep » 18 Nis 2010 02:42

Selam arkadaşlar.... Projemde yedekleme sistemi içerisnde kopyalama yöntemi kullanıyorum. Ancak bir projemde kopyalanacak dosyaların yanında bir de klasör var. İçerisinde üye resimleri saklanıyor. Kopyalama yaparken hedef dosyada bu klasör olunca windows bu dosya var ne yapayım mesajı çıkıyor. Otomatik yedeklme işleminde bu mesaş hoş olmuyor. Ben de önce klasör varsa sildiriyorum sonra kopyalıyorum. Ancak bu defa bir mantık hatası oluşabilir çelişkisine düşüyorum. o da kullanıcıların çöp kutusuna gidip bakmaları "aaaaa bu niye bura gelmiş" deyip tekrar geri yüklemeleri korkutuyor beni açıkçası. (biz programcılar en saf kullanıcıları baz alarak hatasız program yapmak zorundayız olabilecek ihtimalleri düşünmemiz gerekiyor) Bunun için çöp kutusuna göndermeden dizin silme işlemi yapmam lazım ya da klasörün aynısı varsa değiştirme yaparken mesaj vermmesi lazım. Bu konuda yardımcı olabilecek arkadaşlar varsa teşekkürlerimi iletiyorum.

Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 02:10
Konum: İstanbul & Gebze Karışık

Re: Çöp kutusuna göndermeden dizin silme

Mesaj gönderen conari » 19 Nis 2010 07:32

Kod: Tümünü seç

function DelDir(dir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc  := FO_DELETE;
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom  := PChar(dir + #0);
  end;
  Result := (0 = ShFileOperation(fos));
end;
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 151
Kayıt: 01 Oca 2008 05:34

Re: Çöp kutusuna göndermeden dizin silme

Mesaj gönderen Commandx » 21 Nis 2010 11:19

Uses Shellapi yazmayı unutmadan alttaki kod bloğunu kullanarak
kullanıcının haberi olmadan dizin ve alt dizindeki dosyaları silebilirsiniz

Kod: Tümünü seç

procedure DelTree(const DirName: string);
var
   { This procedure uses recursive calls to traverse directory
     structures, so pointers are used to keep stack usage to a
     minimum }
   SearchRec: ^TSearchRec;
   FileName: PString;
   GotOne: Integer;
begin
if trim(DirName)='' then exit;
{ Disable input/output checking }
{$I-}
   { Allocate new TSearchRec record and a new FileName string }
   New(SearchRec);
   New(FileName);

   try
       GotOne := FindFirst(DirName + '\*.*', faAnyFile, SearchRec^);

       while (GotOne = 0) do
       begin
           with SearchRec^ do
           begin
               FileName^ := DirName + '\' + Name;

               { Is the current file a directory? }
               if ((Attr and faDirectory) = 0) then
               begin
                   { The current file is not a directory. Delete it if
                     it's not a system or volume ID file }
                   if ((Attr and (faSysFile or faVolumeID)) = 0) then
                   begin
                       { Change the file's attributes if it's marked as
                         read-only }
                       if ((Attr and faReadOnly) <> 0) then
                           FileSetAttr(FileName^,
                           FileGetAttr(FileName^)
                           and (not faReadOnly));

                       DeleteFile(FileName^);
                   end; { end if }

               end
               else if ((Name <> '.') and (Name <> '..')) then
                   { The current file is a directory. Call ourselves
                     recursively so that we traverse the sub directory
                     structure }
                   DelTree(FileName^);

           end; { end with }

           GotOne := FindNext(SearchRec^);
       end; { end while }

       FindClose(SearchRec^);
       RmDir(DirName);
   finally
       { Dispose of the memory allocate for the TSearchRec record and
         FileName string }
       Dispose(FileName);
       Dispose(SearchRec);
   end; { end try }

{ Re-enable input/output checking }
{$I+}
end;

// KULLANIMI 
procedure TForm1.Button1Click(Sender: TObject);
begin
deltree('c:\test\');
    CreateDirectory('c:\test',nil);// sonra tekrar klasörümüzü oluşturuyoruz
end;
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Function PARSE( text, ilk, son:String ): String; // Çok Lazım oluyor da :)=
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;

Resim

baloglurecep
Üye
Mesajlar: 248
Kayıt: 21 Tem 2006 03:59
İletişim:

Re: Çöp kutusuna göndermeden dizin silme

Mesaj gönderen baloglurecep » 21 Nis 2010 03:45

teşekkür ediyorum arkadaşlar. verdiğiniz yanıtlarla sorun çözüldü.

ferit123
Üye
Mesajlar: 1
Kayıt: 13 Mar 2020 11:06

Re: Çöp kutusuna göndermeden dizin silme

Mesaj gönderen ferit123 » 13 Mar 2020 11:16

Konuyu hortlattım ama lazım olur birilerine...
var
T:TSHFileOpStruct;

fillchar(T, sizeof(T), 0 );
with T do begin
Wnd:=0;
wFunc:=FO_DELETE;
pFrom := pchar(ExtractFilePath(Application.ExeName)+'Hedef Klasörün\'+'*.*' + #0);
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
end;
SHFileOperation(T);

Bu kodla Klasör silip oluşturmaya gerek yok. Hedef Klasördeki tüm dosyaları Geri Dönüşüm kutusuna atmadan silebilirsin.
*.* yazmazsan Klasörü silersin.

Cevapla