Войти

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


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

ddv122
18-02-2012, 05:44
Всем привет. Мне нужно по средствам с++ builder написать программу, которая будет при подключении съемных устройств, в автоматическом режиме, удалять все файлы допустим *.mp3
Возможно ли это?

El Scorpio
18-02-2012, 17:44
Возможно.
И даже средствами самой операционной системы - с использованием командных файлов и скриптов :)

ddv122
18-02-2012, 17:52
в командной строке у меня давно уже вышло
но при условии что батник на самой флэшке или указан путь к флэшке,
а вот что бы автоматом при вставке флэшки удаляла с неё, такое вот не выходит...
с WM_DEVICECHANGE нужно разобраться...

ddv122
19-02-2012, 23:50
Как я понимаю нужен обработчик событий 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
вот код на 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
А еще не подскажите как реализовать удаление папок с файла *.txt(там их список) или с memo

Drongo
20-02-2012, 15:50
Но результат в ComboBox1 и я не знаю как от туда вытащить имя флэшки и применить его в system() »
дальше делаете цикл
...
for(int i = 0; i < ComboBox1->Items->Count; i++){
// Циклический проход по элементам списка
// Выполнение всех необходимых процедур с флекой по порядку
}
...

ferget
20-02-2012, 16:02
примерно так

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
Вот что я хотел
{
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
char s[100];
strcpy(s, Edit1->Text.c_str());
AnsiString DirPath = s, foldername; »
Если рассудок и жизнь дороги вам, никогда не используйте в своей программе char
Если внезапно на флешке окажется файл с именем длиннее ста символов, ваша программа будет выдавать очень интересные и совершенно непредсказуемые ошибки.

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

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
Удалять *.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
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
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
ferget, файлы находит но не удаляет

ferget
21-02-2012, 17:10
исправьте в коде

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

ddv122
21-02-2012, 17:23
ferget, спасибо большое, не подскажите
что бы

if(FindFirst(Path + "*.lnk", faAnyFile, sear) == 0)

Расширение указываем в коде программы, а возможно как сдесь
{
AnsiString DirPath = Edit1->Text;
TStringList* ToDel = new TStringList();
ToDel->LoadFromFile("Spisok.txt"); »
что бы список брался с файла Spisok.txt
и можно было бы удалять не 1 расширение *.lnk а не сколько допустим ещё *.mp3 и *.wav

ferget
21-02-2012, 17:46
вам стоит подумать об использовании 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
Не удаляет почему то ярлыки

{
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
в общем в Ini-файл надо записывать так

*.lnk=

а считывать

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

ddv122
21-02-2012, 20:25
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=




© OSzone.net 2001-2012