Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Чистка флэшки (http://forum.oszone.net/showthread.php?t=228131)

ddv122 18-02-2012 05:44 1861228

Чистка флэшки
 
Всем привет. Мне нужно по средствам с++ builder написать программу, которая будет при подключении съемных устройств, в автоматическом режиме, удалять все файлы допустим *.mp3
Возможно ли это?

El Scorpio 18-02-2012 17:44 1861496

Возможно.
И даже средствами самой операционной системы - с использованием командных файлов и скриптов :)

ddv122 18-02-2012 17:52 1861501

в командной строке у меня давно уже вышло
но при условии что батник на самой флэшке или указан путь к флэшке,
а вот что бы автоматом при вставке флэшки удаляла с неё, такое вот не выходит...
с WM_DEVICECHANGE нужно разобраться...

ddv122 19-02-2012 23:50 1862396

Как я понимаю нужен обработчик событий WM_DEVICECHANGE который будет опрашивать диски с помощью функции GetLogicalDrives, функцией GetDriveType проверять тип, если DRIVE_REMOVABLE -> то съемный диск) и удалять с него файл...Но не получается, может есть варианты у вас?
Вот код
читать дальше »

int n;
DWORD dr = GetLogicalDrives(); //

for(int x = 0; x < 26; x++){
n = ((dr>>x)&1);
if(n){
AnsiString dl = AnsiString((char)(65+x))+":";
UINT DriveType = GetDriveType((dl).c_str());
if(DriveType != DRIVE_CDROM){
if(DriveType != DRIVE_FIXED) {
ComboBox1->Items->Add(dl);


Но результат в ComboBox1 и я не знаю как от туда вытащить имя флэшки и применить его в system()

ferget 20-02-2012 01:05 1862432

вот код на delphi

Код:

var
  Drive: Char; //Буква диска
const
  pref = ':';
begin
  for Drive := 'B' to 'Z' do
    if GetDriveType(PChar(Drive + pref)) = DRIVE_REMOVABLE then lbl1.Caption:=Drive+ pref;


ddv122 20-02-2012 15:31 1862781

А еще не подскажите как реализовать удаление папок с файла *.txt(там их список) или с memo

Drongo 20-02-2012 15:50 1862797

Цитата:

Цитата ddv122
Но результат в ComboBox1 и я не знаю как от туда вытащить имя флэшки и применить его в system() »

дальше делаете цикл
Код:

...
  for(int i = 0; i < ComboBox1->Items->Count; i++){
      // Циклический проход по элементам списка
      // Выполнение всех необходимых процедур с флекой по порядку
    }
...


ferget 20-02-2012 16:02 1862808

примерно так
Код:

TStringList* fileToDel = new TStringList();
fileToDel->LoadFromFile(путь к txt);

int Count= fileToDel ->Count;
 
for (int i = 0; i < Count; i++)
{
    AnsiString FileName= fileToDel[i];
    DeleteFile(FileName);
}
delete fileToDel;


ddv122 20-02-2012 16:55 1862854

Вот что я хотел
Код:

{
char s[100];
strcpy(s, Edit1->Text.c_str());
AnsiString DirPath = s, foldername;
TStringList* ToDel = new TStringList();
ToDel->LoadFromFile("Spisok.txt");
int Count= ToDel ->Count;
for (int i = 0; i < Count; i++)
if (ToDel)
{
AnsiString DirName= ToDel->Strings[i];
RemoveDir(s+DirName);
AnsiString FileName= ToDel->Strings[i];
DeleteFile(s+FileName);
}
}

Можете ещё помочь нужно реализовать
Удалять *.exe файл, если есть одноименная скрытая папка

El Scorpio 21-02-2012 03:07 1863230

Цитата:

Цитата ddv122
char s[100];
strcpy(s, Edit1->Text.c_str());
AnsiString DirPath = s, foldername; »

Если рассудок и жизнь дороги вам, никогда не используйте в своей программе char
Если внезапно на флешке окажется файл с именем длиннее ста символов, ваша программа будет выдавать очень интересные и совершенно непредсказуемые ошибки.

Особенно непонятно, зачем вы используете массив char, периодически чередуя его с объектами AnsiString?

Цитата:

Цитата ddv122
for (int i = 0; i < Count; i++)
if (ToDel)
{
...
}
»

Зачем вы на каждом участке цикла проверяете "истинность" указателя ToDel? Боитесь, что кто-то обнулит его? :)

Код:

{
AnsiString DirPath = Edit1->Text; // И без всяких символьных извращений
TStringList* ToDel = new TStringList();
ToDel->LoadFromFile("Spisok.txt");
AnsiString ObjectName;
// Если порядок цикла не важен, проще задавать его от максимума к нулю:
// сравнение значения с нулём выполняется быстрее, нежели сравнение двух значений,
// да и переменную лишнюю создавать не нужно
// Запомните: чем проще программа, тем меньше в ней ошибок :)
for (int i = ToDel ->Count-1; i >= 0; i--)
{
  ObjectName = DirPath+ToDel->Strings[i];
  if (...) //проверка, есть ли каталог ObjectName - увы, имя функции не помню
      RemoveDir (ObjectName);
  elseif (...) // проверка, есть ли файл ObjectName - увы, имя функции не помню
      DeleteFile (ObjectName);
 
}
delete ToDel; // Не забываем про удаление объектов, созданных командой new


ferget 21-02-2012 04:45 1863243

Цитата:

Цитата ddv122
Удалять *.exe файл, если есть одноименная скрытая папка »

сначала находите имена всех exe без расширения

Код:

TSearchRec sear;
AnsiString Path;
AnsiString  Extension;
AnsiString  FileNoExt; 

    if(FindFirst(Path + "*.exe", faAnyFile, sear) == 0)
    {
        do
        {
            Extension = ExtractFileExt(sear.Name);
            FileNoExt = Copy(sear.Name, 1, length(sear.Name) - length(Extension));
            ....................................
        } 
        while(FindNext(sear) == 0);
    }
 
    FindClose(sear);

затем находите папки faDirectory
сравниваете и удаляете не нужные

как-то так

ddv122 21-02-2012 13:59 1863509

El Scorpio, спасибо
Все разобрался
Код:

{
AnsiString DirPath = Edit1->Text;
TStringList* ToDel = new TStringList();
ToDel->LoadFromFile("Spisok.txt");
AnsiString ObjectName;
for (int i = ToDel ->Count-1; i >= 0; i--)
{
  ObjectName = DirPath+ToDel->Strings[i];
  if (DirectoryExists)
      RemoveDir (ObjectName);
  (FileExists);
      DeleteFile (ObjectName);
      }
delete ToDel;
}

А возможно ли ещё сделать удаление файлов по маске?*.lnk к примеру

ferget 21-02-2012 16:32 1863623

Код:

TSearchRec sear;

    if(FindFirst(Path + "*.lnk", faAnyFile, sear) == 0)
    {
        do
        {
            DeleteFile(sear.Name);
        } 
        while(FindNext(sear) == 0);
    }
 
    FindClose(sear);


ddv122 21-02-2012 17:01 1863657

ferget, файлы находит но не удаляет

ferget 21-02-2012 17:10 1863667

исправьте в коде
Код:

          DeleteFile(Path+"\\"+sear.Name);

ddv122 21-02-2012 17:23 1863680

ferget, спасибо большое, не подскажите
что бы
Код:

if(FindFirst(Path + "*.lnk", faAnyFile, sear) == 0)
Расширение указываем в коде программы, а возможно как сдесь
Цитата:

Цитата ddv122
{
AnsiString DirPath = Edit1->Text;
TStringList* ToDel = new TStringList();
ToDel->LoadFromFile("Spisok.txt"); »

что бы список брался с файла Spisok.txt
и можно было бы удалять не 1 расширение *.lnk а не сколько допустим ещё *.mp3 и *.wav

ferget 21-02-2012 17:46 1863697

вам стоит подумать об использовании ini-файлов

пример ini
Код:

[directory]
//тут список папок для удаления
[files]
//тут список файлов для удаления
[ext]
//тут список расширений для удаления
*.mp3
*.lnk
*.wav

тогда будет для расширений
Код:

TIniFile *Ini = new TIniFile(путь к файлу .ini");
TSearchRec sear;
TStringList* ExtToDel= new TStringList();

ini->ReadSectionValues("ext", ExtToDel);

for (int i = ExtToDel ->Count-1; i >= 0; i--)
{
            if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0)
    {
        do
        {
            DeleteFile(Path+"\\"+sear.Name);
        } 
        while(FindNext(sear) == 0);
    }
 
    FindClose(sear);
}

и для остальных аналогично

ddv122 21-02-2012 18:08 1863717

Не удаляет почему то ярлыки
Код:

{
 AnsiString Path = Edit1->Text;
 TIniFile *Ini = new TIniFile("spisok.ini");
TSearchRec sear;
TStringList* ExtToDel= new TStringList();

Ini->ReadSectionValues("ext", ExtToDel);

for (int i = ExtToDel ->Count-1; i >= 0; i--)
{
            if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0)
    {
        do
        {
              DeleteFile(Path+"\\"+sear.Name);
        }
        while(FindNext(sear) == 0);
    }

    FindClose(sear);
}
}

sposok.ini
Код:

[directory]
\RESTORE\*
[files]
autorun.inf
[ext]
*.tmp
*.lnk
*.inf


ferget 21-02-2012 20:06 1863802

в общем в Ini-файл надо записывать так
Код:

*.lnk=
а считывать
Код:

Ini->ReadSection("ext", ExtToDel);

ddv122 21-02-2012 20:25 1863819

ferget, все ровно не работает

Код:

{
 AnsiString Path = Edit1->Text;
 TIniFile *Ini = new TIniFile("spisok.ini");
TSearchRec sear;
TStringList* ExtToDel= new TStringList();

Ini->ReadSectionValues("ext", ExtToDel);

for (int i = ExtToDel ->Count-1; i >= 0; i--)
{
            if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0)
    {
        do
        {
              DeleteFile(Path+"\\"+sear.Name);
        }
        while(FindNext(sear) == 0);
    }

    FindClose(sear);
}
}

и ini

Код:

[directory]
\RESTORE\*

[files]
autorun.inf

[ext]
*.mp3=
*.lnk=
*.inf=


ferget 21-02-2012 20:42 1863838

Код:

if(FindFirst(Path +"\\"+ ExtToDel->Strings[i], faAnyFile, sear) == 0)

ddv122 21-02-2012 20:51 1863843

ferget, все равно не работает,
Код:

AnsiString Path = Edit1->Text;
Путь вида там: F://

ferget 21-02-2012 20:55 1863846

Цитата:

Цитата ddv122
Путь вида там: F:// »

путь должен быть F:\\
и тогда
Код:

if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0)

ddv122 21-02-2012 21:00 1863855

Цитата:

Цитата ferget
путь должен быть F:\\ »

просто если использовать этот код
Код:

AnsiString DirPath = Edit1->Text;
TStringList* ToDel = new TStringList();
ToDel->LoadFromFile("Spisok.txt");
AnsiString ObjectName;
for (int i = ToDel ->Count-1; i >= 0; i--)
{
  ObjectName = DirPath+ToDel->Strings[i];
  if (DirectoryExists)
      RemoveDir (ObjectName);
  (FileExists);
      DeleteFile (ObjectName);
      }
delete ToDel;

Путь вида F:// в этом коде работает

Цитата:

Цитата ferget
путь должен быть F:\\
»

Я и так пробовал , но не чего не удаляет

ferget 21-02-2012 21:17 1863868

проверил

вот код

Код:

  TSearchRec sear;
          TStringList* ExtToDel= new TStringList();
          AnsiString Path =  Edit1->Text;
          TIniFile* Ini = new TIniFile(ExtractFilePath( Application->ExeName ) +"spissok.ini");

          Ini->ReadSection("ext", ExtToDel);

for (int i = ExtToDel ->Count-1; i >= 0; i--)
{

            if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0)
    {
        do
        {
            DeleteFile(Path+"\\"+sear.Name);
        }
        while(FindNext(sear) == 0);
    }

    FindClose(sear);
}
delete ExtToDel;
 delete Ini;

все удаляет

ddv122 21-02-2012 21:26 1863876

ferget, Спасибо большое!!!Все удаляет ,нужно было добавить IniFile* Ini = new TIniFile(ExtractFilePath( Application->ExeName ) +"spisok.ini");
А еще не подскажите, как сделать лог работы удаления?
к примеру в memo
21.02.2012 21:25:03 - удалено F:\autorun.inf, размер: 0 б
И ещё раз спасибо!Что бы я без вас делал.

ddv122 21-02-2012 22:21 1863912

Цитата:

Цитата ferget
FileNoExt = Copy(sear.Name, 1, length(sear.Name) - length(Extension)); »

[C++ Error] Unit1.cpp(30): E2268 Call to undefined function 'Copy'
Не где о этой функии не чего в интернете не нашел

ferget 22-02-2012 00:20 1863987

ошибочка вышла

Код:

FileNoExt = ChangeFileExt( sear.Name, " " );

ddv122 22-02-2012 00:48 1863999

Цитата:

Цитата ferget
FileNoExt = ChangeFileExt( sear.Name, " " ); »

мы получаем полное имя файла, а нам нужно без расширения

Вот поиск папок

Код:

AnsiString Path = Edit1->Text;
 TSearchRec sear;

    TSearchRec SR;
    if (FindFirst(Path +"\*.*", faDirectory, SR) == 0) {
        do {
            if (SR.Attr == faDirectory)
                memo->Lines->Add("Ïàïêà :"+ SR.Name);
        } while (FindNext(SR) == 0);
        FindClose(SR);
    }
    }


ferget 22-02-2012 02:06 1864026

Цитата:

Цитата ddv122
мы получаем полное имя файла, а нам нужно без расширения »

так и получаем без расширения
вот проверил
Код:

    TSearchRec sear;
      AnsiString  FileNoExt;
      AnsiString Path="E:\\Books\\Test\\ForBuilder\\temp";

    if(FindFirst(Path +"\\"+ "*.txt", faAnyFile, sear) == 0)
    {
        do
        {
          FileNoExt = ChangeFileExt( sear.Name, " " );
          LogMemo->Lines->Add(FileNoExt);
        }
        while(FindNext(sear) == 0);
    }

    FindClose(sear);


ddv122 25-02-2012 16:47 1866332

Цитата:

Цитата ddv122
{
AnsiString DirPath = Edit1->Text;
TStringList* ToDel = new TStringList();
ToDel->LoadFromFile("Spisok.txt");
AnsiString ObjectName;
for (int i = ToDel ->Count-1; i >= 0; i--)
{
ObjectName = DirPath+ToDel->Strings[i];
if (DirectoryExists)
RemoveDir (ObjectName);
(FileExists);
DeleteFile (ObjectName);
}
delete ToDel;
} »

У меня проблема в этом коде не удалят папку если в нем есть файлы, помогите исправить

ferget 26-02-2012 06:12 1866737

вроде так

Код:

if (DirectoryExists)
{
      //тут можно вставить проверку пустая папка или нет
      DeleteDir(ObjectName);
      RemoveDir (ObjectName);
]


ddv122 28-02-2012 12:14 1868283

ferget, [C++ Error] Unit1.cpp(152): E2268 Call to undefined function 'DeleteDir'
Ошибка, мне нужно удалять папку со всем содержимым(не зависимо пуста она или нет)

ferget 28-02-2012 21:40 1868729

вот собственно DeleteDir

Код:

bool DeleteDir(AnsiString DirName)
{
        TSearchRec sr;
        if (DirName.Length())
        {
            if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
                do
                {
                    if (!(sr.Name=="." || sr.Name==".."))
                    if (((sr.Attr & faDirectory) == faDirectory ) || (sr.Attr == faDirectory))
                  {
                          FileSetAttr(DirName+"\\"+sr.Name, faDirectory );
                          DeleteDir(DirName+"\\"+sr.Name);
                          RemoveDir(DirName + "\\"+sr.Name);
                  }
                  else
                  {
                          FileSetAttr(DirName+"\\"+sr.Name, 0);
                          DeleteFile(DirName+"\\"+sr.Name);
                  }
                  while (!FindNext(sr));
                  FindClose(sr);
                  }
                  RemoveDir(DirName);
                  return true;
}


ddv122 03-03-2012 15:42 1871522

ferget, А как их совместить теперь??

ferget 03-03-2012 15:46 1871526

вставьте функцию DeleteDir в файл перед вызовом

ddv122 03-03-2012 15:58 1871538

ferget, я пробывл ошибки только одни

ferget 03-03-2012 17:52 1871611

вот так в коде у меня, удаляется папка с файлами
Код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        AnsiString DirPath = "";
        TStringList* ToDel = new TStringList();
        ToDel->LoadFromFile("Spisok.txt");
        AnsiString ObjectName;
        for (int i = ToDel ->Count-1; i >= 0; i--)
        {
                ObjectName = DirPath+ToDel->Strings[i];
                if (DirectoryExists)
                {
                DeleteDir(ObjectName);
                RemoveDir (ObjectName);
                }else
                (FileExists);
                DeleteFile (ObjectName);
        }
        delete ToDel;

}
//---------------------------------------------------------------------------

bool DeleteDir(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
 if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
 do
  {
  if (!(sr.Name=="." || sr.Name==".."))
  if (((sr.Attr & faDirectory) == faDirectory ) ||
  (sr.Attr == faDirectory))// найдена папка
    {
    FileSetAttr(DirName+"\\"+sr.Name, faDirectory );
    DeleteDir(DirName+"\\"+sr.Name);
    RemoveDir(DirName + "\\"+sr.Name);
    }
    else
    {
    FileSetAttr(DirName+"\\"+sr.Name, 0);
    DeleteFile(DirName+"\\"+sr.Name);
    }
  }
 while (!FindNext(sr));
 FindClose(sr);
 }
RemoveDir(DirName);
return true;
}


ddv122 05-03-2012 22:25 1873127

ferget, спасибо), разобрался, нужно функцию было в начале программы и всё было бы ок),осталось сделать отчет по удаляемых файлов
Код:

if (DirectoryExists)
                {
                DeleteDir(ObjectName);
                RemoveDir (ObjectName);
memo->Lines->Add("Удален "+ ObjectName);
}

Но так выводит список всех файлов или 1 по списку но не как не удаляемого, как исправить как сделать отчет?

void __fastcall TForm1::WMDeviceChange(TMessage& Message)
в AnsiString disk в disk я получаю букву диска в правильном формате(F://) в автоматическом режиме при подключении флэшки

есть на форме где то 5 button в везде у них в начале указывалось так
AnsiString DirPath = Edit1->Text, FilePath;
Раньше я брал буквы дисков с Edit1
Но это не функционально, если подключаешь сразу несколько флэшек, а сейчас хочется это автоматизировать,но не загружая код, реально ли?

ddv122 11-03-2012 20:09 1877053

Все доделал осталось сделать только удаление .*exe если есть одноименная скрытая папка
Цитата:

Цитата ferget
TSearchRec sear;
AnsiString FileNoExt;
AnsiString Path="E:\\Books\\Test\\ForBuilder\\temp";
if(FindFirst(Path +"\\"+ "*.txt", faAnyFile, sear) == 0)
{
do
{
FileNoExt = ChangeFileExt( sear.Name, " " );
LogMemo->Lines->Add(FileNoExt);
}
while(FindNext(sear) == 0);
}
FindClose(sear); »

Осталось сравнить их

ferget 12-03-2012 03:44 1877361

вот у вас есть два списка
допустим
list1 - список файлов
list2 - список папок
вот так сравниваете
Код:

for(int i=0;i<list1->Count;i++)
        {
                for(int j=0;j<list2->Count;j++)
                {
                        AnsiString find = list2->Strings[j].UpperCase();
                        if(list1->Strings[i].SetLength(list1->Strings[i].Length()-4).UpperCase()==find)
                        {
                          //делаете что-нибудь (list1->Strings[i]);
                          //делаете что-нибудь (list2->Strings[j]);
                        }
                }
        }


ddv122 14-03-2012 11:09 1878918

Цитата:

Цитата ferget
Код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString DirPath = "";
 TStringList* ToDel = new TStringList();
 ToDel->LoadFromFile("Spisok.txt");
 AnsiString ObjectName;
 for (int i = ToDel ->Count-1; i >= 0; i--)
 {
 ObjectName = DirPath+ToDel->Strings[i];
 if (DirectoryExists)
 {
 DeleteDir(ObjectName);
 RemoveDir (ObjectName);
 }else
 (FileExists);
 DeleteFile (ObjectName);
 }
 delete ToDel;
}
//---------------------------------------------------------------------------
bool DeleteDir(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
 if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
 do
 {
 if (!(sr.Name=="." || sr.Name==".."))
 if (((sr.Attr & faDirectory) == faDirectory ) ||
 (sr.Attr == faDirectory))// найдена папка
 {
 FileSetAttr(DirName+"\\"+sr.Name, faDirectory );
 DeleteDir(DirName+"\\"+sr.Name);
 RemoveDir(DirName + "\\"+sr.Name);
 }
 else
 {
 FileSetAttr(DirName+"\\"+sr.Name, 0);
 DeleteFile(DirName+"\\"+sr.Name);
 }
 }
 while (!FindNext(sr));
 FindClose(sr);
 }
RemoveDir(DirName);
return true

»

Беда, так он очищает Всё с AnsiString DirPath = "Edit1->Text";
Т.е все папки с диска, а не со spisok.txt

ferget 14-03-2012 20:18 1879306

вот полный код, удаляет только папки указанные в Spisok.txt

Код:

#include <vcl.h>
#include "dstring.h"
#pragma hdrstop


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

bool DeleteDir(AnsiString DirName);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
        AnsiString DirPath = Edit1->Text+"\\";

        TStringList* ToDel = new TStringList();
        ToDel->LoadFromFile("Spisok.txt");
        AnsiString ObjectName;
        for (int i = ToDel ->Count-1; i >= 0; i--)
        {
                ObjectName = DirPath+ToDel->Strings[i];
                if (DirectoryExists)
                {
                  DeleteDir(ObjectName);
                  RemoveDir (ObjectName);
                }else
                (FileExists);
                DeleteFile (ObjectName);
        }
        delete ToDel;

}
//---------------------------------------------------------------------------

bool DeleteDir(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
  if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
  do
  {
      if (!(sr.Name=="." || sr.Name==".."))
      if (((sr.Attr & faDirectory) == faDirectory ) || (sr.Attr == faDirectory))
      {
        FileSetAttr(DirName+"\\"+sr.Name, faDirectory );
        DeleteDir(DirName+"\\"+sr.Name);
        RemoveDir(DirName + "\\"+sr.Name);
      }
      else
      {
        FileSetAttr(DirName+"\\"+sr.Name, 0);
        DeleteFile(DirName+"\\"+sr.Name);
      }
  }
  while (!FindNext(sr));
  FindClose(sr);
  }
  RemoveDir(DirName);
  return true;
}

кстати, а как вы папки в Spisok.txt указываете

ddv122 14-03-2012 23:18 1879441

Цитата:

Цитата ferget
кстати, а как вы папки в Spisok.txt указываете »

Ну к примеру
Код:

spisok.txt

Del/
111/

Путь беру с Edit1
H://

Если не указана функция

Код:


bool DeleteDir(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
 if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
 do
 {
 if (!(sr.Name=="." || sr.Name==".."))
 if (((sr.Attr & faDirectory) == faDirectory ) ||
 (sr.Attr == faDirectory))// найдена папка
 {
 FileSetAttr(DirName+"\\"+sr.Name, faDirectory );
 DeleteDir(DirName+"\\"+sr.Name);
 RemoveDir(DirName + "\\"+sr.Name);
 }
 else
 {
 FileSetAttr(DirName+"\\"+sr.Name, 0);
 DeleteFile(DirName+"\\"+sr.Name);
 }
 }
 while (!FindNext(sr));
 FindClose(sr);
 }
RemoveDir(DirName);
return true

То удаляет только пустые папки, а с функции все папки и файлы с корня

ddv122 26-03-2012 12:20 1886983

Не подскажите как этот код переделать для удаления папок и файлов
Код:

{
AnsiString Path = Edit1->Text;
TSearchRec sear;
TStringList* ExtToDel= new TStringList();
TIniFile* Ini = new TIniFile(ExtractFilePath( Application->ExeName ) +"spisok.ini");
Ini->ReadSection("ext", ExtToDel);
for (int i = ExtToDel ->Count-1; i >= 0; i--)
{
if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0)
{
do
{
DeleteFile(Path+"\\"+sear.Name);
dt = Now();// формат даты
memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт");
}
while(FindNext(sear) == 0);
}
FindClose(sear);
}
delete ExtToDel;
delete Ini;
}


ferget 26-03-2012 14:17 1887047

Цитата:

Цитата ddv122
как этот код переделать для удаления папок и файлов »

в этом коде происходит поиск по расширению, а если уже указаны имена файлов и папок, то что искать?

ddv122 26-03-2012 15:10 1887078

ferget, просто хочется расширить функционал, что бы 3в1)Удаление по расширению, удаление папок и удаление файлов.
в файле spisok.ini
Код:

[ext]
*.lnk=
*.inf=
[Files]
1.rar
2.bmp
[Folder]
del
retro=


ferget 27-03-2012 05:13 1887457

объявляете еще два TStringList

допустим

Код:

TStringList* FileToDel= new TStringList();
TStringList* FolderToDel= new TStringList();

считываете через Ini->ReadSection

и каждый список обрабатываете

ddv122 27-03-2012 11:57 1887666

Код:

{
AnsiString Path = Edit1->Text;
TSearchRec sear;
TStringList* ExtToDel= new TStringList();
TStringList* FileToDel= new TStringList();
TStringList* FolderToDel= new TStringList();
TIniFile* Ini = new TIniFile(ExtractFilePath( Application->ExeName ) +"spisok.ini");
Ini->ReadSection("ext", ExtToDel);
.....
Ini->ReadSection("files", FileToDel);
...........
Ini->ReadSection("Folder", FolderToDel);
}

Это я понимаю а как обработать?

ferget 27-03-2012 13:18 1887703

например так для файлов

Код:

AnsiString Path = Edit1->Text;
TSearchRec sear;
TStringList* ExtToDel= new TStringList();
TStringList* FileToDel= new TStringList();
TIniFile* Ini = new TIniFile(ExtractFilePath( Application->ExeName ) +"spisok.ini");
Ini->ReadSection("ext", ExtToDel);
for (int i = ExtToDel ->Count-1; i >= 0; i--)
{
if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0)
{
do
{
DeleteFile(Path+"\\"+sear.Name);
dt = Now();// формат даты
memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт");
}
while(FindNext(sear) == 0);
}
FindClose(sear);
}
delete ExtToDel;

Ini->ReadSection("files", FileToDel);

      AnsiString ObjectName;
        for (int i =  FileToDel ->Count-1; i >= 0; i--)
        {
                ObjectName = DirPath+ FileToDel->Strings[i];
                DeleteFile (ObjectName);
        }
        delete FileToDel;

delete Ini;

и для папок аналогично

хотя лучше вынести в отдельную функцию

ddv122 27-03-2012 13:41 1887718

Цитата:

Цитата ferget
например так для файлов »

а можно как либо без
Цитата:

Цитата ferget
AnsiString ObjectName; »

Что бы сделать отчет как сдесь

Код:

memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт");

ferget 27-03-2012 14:09 1887742

путь и имя и так в ObjectName

для того, чтобы получить размер файла можно использовать вот такую функцию

Код:

long getFileSize(const AnsiString &Filename)
{
  long ret = -1;

  HANDLE hFile = CreateFile(Filename.c_str(), GENERIC_READ,
  FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if( hFile != INVALID_HANDLE_VALUE )
  {
      ret = GetFileSize(hFile, NULL);
      CloseHandle(hFile);
  }
  return ret;
}

то есть


Код:

for (int i =  FileToDel ->Count-1; i >= 0; i--)
        {
                ObjectName = DirPath+ FileToDel->Strings[i];
                long size= long getFileSize(&ObjectName );
                DeleteFile (ObjectName);
                ...................................................................
                //тут делаете отчет, в size размер файла
        }
        delete FileToDel;


ddv122 28-03-2012 12:44 1888437

ferget, ааа нашел ошибку.
если в spisok.txt есть пустые строчки, тогда он удаляет все с корня

Код:

#include <vcl.h>
#include "dstring.h"
#pragma hdrstop


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

bool DeleteDir(AnsiString DirName);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
        AnsiString DirPath = Edit1->Text+"\\";

        TStringList* ToDel = new TStringList();
        ToDel->LoadFromFile("Spisok.txt");
        AnsiString ObjectName;
        for (int i = ToDel ->Count-1; i >= 0; i--)
        {
                ObjectName = DirPath+ToDel->Strings[i];
                if (DirectoryExists)
                {
                  DeleteDir(ObjectName);
                  RemoveDir (ObjectName);
                }else
                (FileExists);
                DeleteFile (ObjectName);
        }
        delete ToDel;

}
//---------------------------------------------------------------------------

bool DeleteDir(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
  if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
  do
  {
      if (!(sr.Name=="." || sr.Name==".."))
      if (((sr.Attr & faDirectory) == faDirectory ) || (sr.Attr == faDirectory))
      {
        FileSetAttr(DirName+"\\"+sr.Name, faDirectory );
        DeleteDir(DirName+"\\"+sr.Name);
        RemoveDir(DirName + "\\"+sr.Name);
      }
      else
      {
        FileSetAttr(DirName+"\\"+sr.Name, 0);
        DeleteFile(DirName+"\\"+sr.Name);
      }
  }
  while (!FindNext(sr));
  FindClose(sr);
  }
  RemoveDir(DirName);
  return true;
}


ddv122 28-03-2012 13:19 1888477

Код:

if(!FileExists("spisok.txt"))
  {
    List1->Add(spisok->Memo1->Text);
    List1->SaveToFile("spisok.txt");
  }

Так я проверяю наличие файла
Как мне исключить пустые строчки?

Memo1->Lines->Text=Trim(Memo1->Lines->Text);
Уберает пустые строки с memo. но если файл изменен руками....

ferget 28-03-2012 13:39 1888491

можно проверять при чтении

Код:

if (!spisok->Strings[i].IsEmpty())
spisok здесь TStringList

ddv122 28-03-2012 13:51 1888501

ferget, спасибо, только не получается у меня отчет сделать как сдесь
Цитата:

Цитата ddv122
memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт"); »


ferget 28-03-2012 14:09 1888508

что именно не получается?

ddv122 28-03-2012 14:16 1888515

Код:

            DeleteDir(ObjectName);
                  RemoveDir (ObjectName);
                  memo->Lines->Add("Удалена папка : "+ ?????????????);

                }else
                (FileExists);
                DeleteFile (ObjectName);
memo->Lines->Add("Удален файл : "+ ?????????????);

Если прописывать +ObjectName то выводит список всего, а мне нужно только удаленного

El Scorpio 29-03-2012 07:10 1888986

Цитата:

Цитата ddv122
memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт"); »

Вообще-то так писать не стоит.
Во-первых, это очень сложно отлаживать.
Во-вторых, текст в кавычках имеет тип const char* (указатель на массив символов), и попытка "дописать" к нему целочисленное значение через плюс может привести к противоположному результату.
Лучше использовать функцию Format(ИСХ_СТРОКА, ПАРАМЕТРЫ)
В исходной строке вы указываете спец-символы (%d, %s и т.д.), в которые функция автоматически подставит нужные значения из списка параметров. Список параметров передаётся через макрос ARRAYOFCONST

Пример использования
Код:

const AnsiString Sourse_Message = "Есть %d единиц товара \"%s\" по цене %d руб.";
AnsiString Name = ...;
int Count = ...;
int Cost = ...;
AnsiString Result = Format (Sourse_Message, ARRAYOFCONST((Count, Name, Cost)));


ddv122 24-05-2012 21:59 1922041

Код:

AnsiString Path = Edit1->Text;
TSearchRec sear;
TStringList* ExtToDel= new TStringList();
TIniFile* Ini = new TIniFile(ExtractFilePath( Application->ExeName ) +"spisok.ini");
Ini->ReadSection("ext", ExtToDel);
for (int i = ExtToDel ->Count-1; i >= 0; i--)
{
if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0)
{
do
{
DeleteFile(Path+"\\"+sear.Name);
dt = Now();// формат даты
memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт");
}
while(FindNext(sear) == 0);
}
FindClose(sear);

Добрый вечер.Не подскажите как к этому коду сделать список исключений,
Допустим удаляет все *.mp3 файлы но кроме 122.mp3

ferget 24-05-2012 22:17 1922047

Код:

if(sear.Name!="тут имя файла")
{
  DeleteFile(Path+"\\"+sear.Name);
  dt = Now();// формат даты
  memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык :    "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт");
}


ddv122 24-05-2012 22:31 1922053

ferget, не работает этот код

ferget 24-05-2012 22:32 1922054

Цитата:

Цитата ddv122
не работает этот код »

не работает - это как

ddv122 24-05-2012 22:36 1922057

ferget, а хотя стойте, работает, извиняюсь что то я намудрил, а как с отчёта убрать?

ferget 24-05-2012 22:47 1922069

а если так

Код:

if(sear.Name == "тут имя файла") continue;

ddv122 24-05-2012 22:57 1922074

Код:

  AnsiString disk = Edit1->Text;
    TSearchRec sear;
    Ini2->ReadSection( "ext", ToExt );
    for ( int i = ToExt->Count - 1; i >= 0; i-- ) {
        if ( ! FindFirst( disk + ToExt->Strings[i], faAnyFile, sear ) ) {
            do {
          for ( int k = NoDel->Count - 1; k >= 0; k-- )
              if(sear.Name!=disk + NoDel->Strings[k])
                DeleteFile( disk + "\\" + sear.Name );
                dt = Now( );
                Log->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Óäàë¸í ÿðëûê: " + sear.Name + ", Ðàçìåð: " + IntToStr( sear.Size ) + " Áàéò" );
            } while ( ! FindNext( sear ) );
        }
        FindClose( sear );
    }

А так правильно будет?со списком?

ferget 24-05-2012 23:05 1922081

Цитата:

Цитата ddv122
как с отчёта убрать »

фигурные скобки

Код:

if(sear.Name!=disk + NoDel->Strings[i])
{
                DeleteFile( disk + "\\" + sear.Name );
                dt = Now( );
                Log->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Óäàë¸í ÿðëûê: " +  sear.Name + ", Ðàçìåð: " + IntToStr( sear.Size ) + " Áàéò" );
}

Цитата:

Цитата ddv122
А так правильно будет?со списком? »

это зависит от того какой текст в sear.Name

ddv122 24-05-2012 23:10 1922082

ну как бы в ToExt - расширения для удаления (чёрный список) к примеру *.mp3
NoDel - исключения - 122.mp3
Но всё равно что то не так...
Удаляет файлы с NoDel

Цитата:

Цитата ferget
фигурные скобки »

Тогда в отчёте 2 строки получает но с другими файлами

ferget 24-05-2012 23:18 1922092

какой текст в sear.Name, только имя файла или полный путь?

ddv122 24-05-2012 23:26 1922099

Код:

if(sear.Name!=disk + NoDel->Strings[k])
Полный путь...


Время: 03:30.

Время: 03:30.
© OSzone.net 2001-