Показать полную графическую версию : Чистка флэшки
вот у вас есть два списка
допустим
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]);
}
}
}
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
вот полный код, удаляет только папки указанные в 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 указываете
кстати, а как вы папки в 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
То удаляет только пустые папки, а с функции все папки и файлы с корня
Не подскажите как этот код переделать для удаления папок и файлов
{
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, просто хочется расширить функционал, что бы 3в1)Удаление по расширению, удаление папок и удаление файлов.
в файле spisok.ini
[ext]
*.lnk=
*.inf=
[Files]
1.rar
2.bmp
[Folder]
del
retro=
объявляете еще два TStringList
допустим
TStringList* FileToDel= new TStringList();
TStringList* FolderToDel= new TStringList();
считываете через Ini->ReadSection
и каждый список обрабатываете
{
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);
}
Это я понимаю а как обработать?
например так для файлов
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;
и для папок аналогично
хотя лучше вынести в отдельную функцию
например так для файлов »
а можно как либо без AnsiString ObjectName; »
Что бы сделать отчет как сдесь
memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт");
путь и имя и так в 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;
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;
}
if(!FileExists("spisok.txt"))
{
List1->Add(spisok->Memo1->Text);
List1->SaveToFile("spisok.txt");
}
Так я проверяю наличие файла
Как мне исключить пустые строчки?
Memo1->Lines->Text=Trim(Memo1->Lines->Text);
Уберает пустые строки с memo. но если файл изменен руками....
можно проверять при чтении
if (!spisok->Strings[i].IsEmpty())
spisok здесь TStringList
ferget, спасибо, только не получается у меня отчет сделать как сдесь
memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт"); »
что именно не получается?
DeleteDir(ObjectName);
RemoveDir (ObjectName);
memo->Lines->Add("Удалена папка : "+ ?????????????);
}else
(FileExists);
DeleteFile (ObjectName);
memo->Lines->Add("Удален файл : "+ ?????????????);
Если прописывать +ObjectName то выводит список всего, а мне нужно только удаленного
El Scorpio
29-03-2012, 07:10
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)));
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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.