Войти

Показать полную графическую версию : Чистка флэшки


Страниц : 1 2 [3] 4

ferget
12-03-2012, 03:44
вот у вас есть два списка
допустим
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
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
вот полный код, удаляет только папки указанные в 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
кстати, а как вы папки в 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
Не подскажите как этот код переделать для удаления папок и файлов

{
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
как этот код переделать для удаления папок и файлов »
в этом коде происходит поиск по расширению, а если уже указаны имена файлов и папок, то что искать?

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

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

ferget
27-03-2012, 05:13
объявляете еще два TStringList

допустим


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


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

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

ddv122
27-03-2012, 11:57
{
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
например так для файлов


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
например так для файлов »
а можно как либо без AnsiString ObjectName; »
Что бы сделать отчет как сдесь

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

ferget
27-03-2012, 14:09
путь и имя и так в 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
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
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
можно проверять при чтении


if (!spisok->Strings[i].IsEmpty())


spisok здесь TStringList

ddv122
28-03-2012, 13:51
ferget, спасибо, только не получается у меня отчет сделать как сдесь
memo->Lines->Add(DateToStr(dt) +" " + TimeToStr(dt) +" " + " - "+"Удален ярлык : "+Path+sear.Name+", размер: " +IntToStr(sear.Size)+" байт"); »

ferget
28-03-2012, 14:09
что именно не получается?

ddv122
28-03-2012, 14:16
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)));

ddv122
24-05-2012, 21:59
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