Показать полную графическую версию : Чистка флэшки
Всем привет. Мне нужно по средствам с++ builder написать программу, которая будет при подключении съемных устройств, в автоматическом режиме, удалять все файлы допустим *.mp3
Возможно ли это?
El Scorpio
18-02-2012, 17:44
Возможно.
И даже средствами самой операционной системы - с использованием командных файлов и скриптов :)
в командной строке у меня давно уже вышло
но при условии что батник на самой флэшке или указан путь к флэшке,
а вот что бы автоматом при вставке флэшки удаляла с неё, такое вот не выходит...
с WM_DEVICECHANGE нужно разобраться...
Как я понимаю нужен обработчик событий 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()
вот код на 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;
А еще не подскажите как реализовать удаление папок с файла *.txt(там их список) или с memo
Но результат в ComboBox1 и я не знаю как от туда вытащить имя флэшки и применить его в system() »
дальше делаете цикл
...
for(int i = 0; i < ComboBox1->Items->Count; i++){
// Циклический проход по элементам списка
// Выполнение всех необходимых процедур с флекой по порядку
}
...
примерно так
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;
Вот что я хотел
{
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
Удалять *.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
сравниваете и удаляете не нужные
как-то так
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 к примеру
TSearchRec sear;
if(FindFirst(Path + "*.lnk", faAnyFile, sear) == 0)
{
do
{
DeleteFile(sear.Name);
}
while(FindNext(sear) == 0);
}
FindClose(sear);
ferget, файлы находит но не удаляет
исправьте в коде
DeleteFile(Path+"\\"+sear.Name);
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
вам стоит подумать об использовании 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);
}
и для остальных аналогично
Не удаляет почему то ярлыки
{
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
в общем в Ini-файл надо записывать так
*.lnk=
а считывать
Ini->ReadSection("ext", ExtToDel);
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.