![]() |
Чистка флэшки
Всем привет. Мне нужно по средствам с++ builder написать программу, которая будет при подключении съемных устройств, в автоматическом режиме, удалять все файлы допустим *.mp3
Возможно ли это? |
Возможно.
И даже средствами самой операционной системы - с использованием командных файлов и скриптов :) |
в командной строке у меня давно уже вышло
но при условии что батник на самой флэшке или указан путь к флэшке, а вот что бы автоматом при вставке флэшки удаляла с неё, такое вот не выходит... с WM_DEVICECHANGE нужно разобраться... |
Как я понимаю нужен обработчик событий WM_DEVICECHANGE который будет опрашивать диски с помощью функции GetLogicalDrives, функцией GetDriveType проверять тип, если DRIVE_REMOVABLE -> то съемный диск) и удалять с него файл...Но не получается, может есть варианты у вас?
Вот код Но результат в ComboBox1 и я не знаю как от туда вытащить имя флэшки и применить его в system() |
вот код на delphi
Код:
var |
А еще не подскажите как реализовать удаление папок с файла *.txt(там их список) или с memo
|
Цитата:
Код:
... |
примерно так
Код:
TStringList* fileToDel = new TStringList(); |
Вот что я хотел
Код:
{ Удалять *.exe файл, если есть одноименная скрытая папка |
Цитата:
Если внезапно на флешке окажется файл с именем длиннее ста символов, ваша программа будет выдавать очень интересные и совершенно непредсказуемые ошибки. Особенно непонятно, зачем вы используете массив char, периодически чередуя его с объектами AnsiString? Цитата:
Код:
{ |
Цитата:
Код:
TSearchRec sear; сравниваете и удаляете не нужные как-то так |
El Scorpio, спасибо
Все разобрался Код:
{ |
Код:
TSearchRec sear; |
ferget, файлы находит но не удаляет
|
исправьте в коде
Код:
DeleteFile(Path+"\\"+sear.Name); |
ferget, спасибо большое, не подскажите
что бы Код:
if(FindFirst(Path + "*.lnk", faAnyFile, sear) == 0) Цитата:
и можно было бы удалять не 1 расширение *.lnk а не сколько допустим ещё *.mp3 и *.wav |
вам стоит подумать об использовании ini-файлов
пример ini Код:
[directory] Код:
TIniFile *Ini = new TIniFile(путь к файлу .ini"); |
Не удаляет почему то ярлыки
Код:
{ Код:
[directory] |
в общем в Ini-файл надо записывать так
Код:
*.lnk= Код:
Ini->ReadSection("ext", ExtToDel); |
ferget, все ровно не работает
Код:
{ Код:
[directory] |
Код:
if(FindFirst(Path +"\\"+ ExtToDel->Strings[i], faAnyFile, sear) == 0) |
ferget, все равно не работает,
Код:
AnsiString Path = Edit1->Text; |
Цитата:
и тогда Код:
if(FindFirst(Path + ExtToDel->Strings[i], faAnyFile, sear) == 0) |
Цитата:
Код:
AnsiString DirPath = Edit1->Text; Цитата:
|
проверил
вот код Код:
TSearchRec sear; |
ferget, Спасибо большое!!!Все удаляет ,нужно было добавить IniFile* Ini = new TIniFile(ExtractFilePath( Application->ExeName ) +"spisok.ini");
А еще не подскажите, как сделать лог работы удаления? к примеру в memo 21.02.2012 21:25:03 - удалено F:\autorun.inf, размер: 0 б И ещё раз спасибо!Что бы я без вас делал. |
Цитата:
Не где о этой функии не чего в интернете не нашел |
ошибочка вышла
Код:
FileNoExt = ChangeFileExt( sear.Name, " " ); |
Цитата:
Вот поиск папок Код:
AnsiString Path = Edit1->Text; |
Цитата:
вот проверил Код:
TSearchRec sear; |
Цитата:
|
вроде так
Код:
if (DirectoryExists) |
ferget, [C++ Error] Unit1.cpp(152): E2268 Call to undefined function 'DeleteDir'
Ошибка, мне нужно удалять папку со всем содержимым(не зависимо пуста она или нет) |
вот собственно DeleteDir
Код:
bool DeleteDir(AnsiString DirName) |
ferget, А как их совместить теперь??
|
вставьте функцию DeleteDir в файл перед вызовом
|
ferget, я пробывл ошибки только одни
|
вот так в коде у меня, удаляется папка с файлами
Код:
void __fastcall TForm1::Button1Click(TObject *Sender) |
ferget, спасибо), разобрался, нужно функцию было в начале программы и всё было бы ок),осталось сделать отчет по удаляемых файлов
Код:
if (DirectoryExists) void __fastcall TForm1::WMDeviceChange(TMessage& Message) в AnsiString disk в disk я получаю букву диска в правильном формате(F://) в автоматическом режиме при подключении флэшки есть на форме где то 5 button в везде у них в начале указывалось так AnsiString DirPath = Edit1->Text, FilePath; Раньше я брал буквы дисков с Edit1 Но это не функционально, если подключаешь сразу несколько флэшек, а сейчас хочется это автоматизировать,но не загружая код, реально ли? |
Все доделал осталось сделать только удаление .*exe если есть одноименная скрытая папка
Цитата:
|
вот у вас есть два списка
допустим list1 - список файлов list2 - список папок вот так сравниваете Код:
for(int i=0;i<list1->Count;i++) |
Цитата:
Т.е все папки с диска, а не со spisok.txt |
вот полный код, удаляет только папки указанные в Spisok.txt
Код:
#include <vcl.h> |
Цитата:
Код:
spisok.txt H:// Если не указана функция Код:
|
Не подскажите как этот код переделать для удаления папок и файлов
Код:
{ |
Цитата:
|
ferget, просто хочется расширить функционал, что бы 3в1)Удаление по расширению, удаление папок и удаление файлов.
в файле spisok.ini Код:
[ext] |
объявляете еще два TStringList
допустим Код:
TStringList* FileToDel= new TStringList(); и каждый список обрабатываете |
Код:
{ |
например так для файлов
Код:
AnsiString Path = Edit1->Text; хотя лучше вынести в отдельную функцию |
|
путь и имя и так в ObjectName
для того, чтобы получить размер файла можно использовать вот такую функцию Код:
long getFileSize(const AnsiString &Filename) Код:
for (int i = FileToDel ->Count-1; i >= 0; i--) |
ferget, ааа нашел ошибку.
если в spisok.txt есть пустые строчки, тогда он удаляет все с корня Код:
#include <vcl.h> |
Код:
if(!FileExists("spisok.txt")) Как мне исключить пустые строчки? Memo1->Lines->Text=Trim(Memo1->Lines->Text); Уберает пустые строки с memo. но если файл изменен руками.... |
можно проверять при чтении
Код:
if (!spisok->Strings[i].IsEmpty()) |
ferget, спасибо, только не получается у меня отчет сделать как сдесь
Цитата:
|
что именно не получается?
|
Код:
DeleteDir(ObjectName); |
Цитата:
Во-первых, это очень сложно отлаживать. Во-вторых, текст в кавычках имеет тип const char* (указатель на массив символов), и попытка "дописать" к нему целочисленное значение через плюс может привести к противоположному результату. Лучше использовать функцию Format(ИСХ_СТРОКА, ПАРАМЕТРЫ) В исходной строке вы указываете спец-символы (%d, %s и т.д.), в которые функция автоматически подставит нужные значения из списка параметров. Список параметров передаётся через макрос ARRAYOFCONST Пример использования Код:
const AnsiString Sourse_Message = "Есть %d единиц товара \"%s\" по цене %d руб."; |
Код:
AnsiString Path = Edit1->Text; Допустим удаляет все *.mp3 файлы но кроме 122.mp3 |
Код:
if(sear.Name!="тут имя файла") |
ferget, не работает этот код
|
Цитата:
|
ferget, а хотя стойте, работает, извиняюсь что то я намудрил, а как с отчёта убрать?
|
а если так
Код:
if(sear.Name == "тут имя файла") continue; |
Код:
AnsiString disk = Edit1->Text; |
Цитата:
Код:
if(sear.Name!=disk + NoDel->Strings[i]) Цитата:
|
ну как бы в ToExt - расширения для удаления (чёрный список) к примеру *.mp3
NoDel - исключения - 122.mp3 Но всё равно что то не так... Удаляет файлы с NoDel Цитата:
|
какой текст в sear.Name, только имя файла или полный путь?
|
Код:
if(sear.Name!=disk + NoDel->Strings[k]) |
Время: 03:30. |
Время: 03:30.
© OSzone.net 2001-