Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.11.10;
Скачать: CL | DM;

Вниз

Открытие файла своей программой.   Найти похожие ветки 

 
имя   (2013-02-07 22:07) [40]

Удалено модератором
Примечание: может лучше сразу бан по IP, как думаешь?


 
brother ©   (2013-02-08 04:15) [41]

чтож всех на скрытность то тянет?
мои наброски, разбирайся!
function TProgramForm.SafeRemoval(drive: char): boolean;
var
 sh : SHFILEOPSTRUCT;

 FreeBytesAvailableToCaller: TLargeInteger;
 FreeSize: TLargeInteger;
 TotalSize: TLargeInteger;

 f: file;
 NumWritten: Integer;
 Buf: pointer;
 bufSize: Integer;
 BytesWrite: TLargeInteger;
begin
 result:= False;
 StopSafeRemoval:= False;

//  ShowMessage("Удаление всего содержимого диска, это может занять длительное время, ждите...");

 // Удаляем ВСЕ содержимое с устройства!
 AddLog("Удаление всего содержимого диска, ждите...");
 sh.Wnd := Application.Handle;
 sh.wFunc := FO_DELETE;
 sh.pFrom := PAnsiChar(drive + ":\*.*");
 sh.pTo := nil;
 sh.fFlags := FOF_NOCONFIRMATION + FOF_SILENT+ FOF_NOERRORUI;
 sh.fAnyOperationsAborted := False;
 sh.hNameMappings := nil;
 sh.lpszProgressTitle := nil;
 if SHFileOperation(sh) <> 0 then
 begin
  AddLog("Не удалось(файлы/папки заняты другим приложением?)");
  //Exit;
 end
 else
   AddLog("Ok");

 // узнаем кол-во свободного места на диске
 if not GetDiskFreeSpaceEx(PChar(drive + ":\"), FreeBytesAvailableToCaller, Totalsize, @FreeSize) then
 begin
   AddLog("Ошибка получения свободного места: " + GetLastErrorText);
   exit;
 end
 else
   AddLog("Свободное место на диске: " + IntToStr(FreeBytesAvailableToCaller) + " байт");

//  FreeBytesAvailableToCaller:= {1073741824;} 2147483648;

 // Создаем файл с пустым содержимым по размеру всего диска
 AddLog("Создание временного файла, ждите...");
 BufSize := 1048576; // 1МБ
 GetMem(buf, BufSize);
 //Gauge1.MaxValue:= FreeBytesAvailableToCaller;
 BytesWrite:= 0;
 try
   assignfile(f, drive + ":\tmp.$$$");
   rewrite(f, 1);
   while (BytesWrite+bufSize <= FreeBytesAvailableToCaller) and (not StopSafeRemoval) do
   begin
     BlockWrite(f, Buf^, BufSize, NumWritten);
     Inc(BytesWrite, NumWritten);
//      Gauge1.Progress:= BytesWrite;
     application.ProcessMessages;
   end;
 except
   FreeMem(Buf);
   CloseFile(f);
 end;
 if StopSafeRemoval then
 begin
   AddLog("Отменено пользователем!");
   FreeMem(Buf);
   CloseFile(f);
   Exit;
 end;
 // если в конце не дозаписан хвост меньше bufSize дозапишем его
 if BytesWrite < FreeBytesAvailableToCaller then
 begin
   BufSize := FreeBytesAvailableToCaller-BytesWrite;
   FreeMem(Buf);
   GetMem(buf, BufSize);
   BlockWrite(f, Buf^, BufSize, NumWritten);
 end;
 FreeMem(Buf);
 CloseFile(f);

 AddLog("Ok");

{  if DeleteFile(drive + ":\tmp.$$$") then
   AddLog("Временный файл успешно удален")
 else
 begin
   AddLog("Ошибка удаления временного файла");
   exit;
 end;}

 result:= True;
end;


 
brother ©   (2013-02-08 04:18) [42]

упс, промахнулся топиком)


 
vlad   (2013-02-08 12:23) [43]


> Rouse_ ©   (07.02.13 22:03) [39]
>
>
> > Inovet ©   (07.02.13 21:29) [35]
> > Уже 4 раза сказали.
>
> Лучше 1 раз разжевать, чем 4 раз рассказать :)


Так уж сложилось, что нужно именно закрывать старую копию, а не передавать в старую копию новые параметры

Один момент не понятен и все(

procedure TMyForm.FormCreate(Sender: TObject);
begin
 //почему эта команда не закрывает старую копию?
 SendMessage(FindWindow(nil, "MyProgram"), WM_CLOSE, 1, 0);
 //а эта работает без проблем?
 SendMessage(FindWindow(nil, "Диспетчер задач Windows"), WM_CLOSE, 1, 0);
end;


 
Ega23 ©   (2013-02-08 12:39) [44]


> Так уж сложилось, что нужно именно закрывать старую копию,
>  а не передавать в старую копию новые параметры


Просто любопытно: а почему? Почему не передать новые данные в старую копию, с расчётом на то, что она бросит текущие данные и займётся новыми?


 
vlad   (2013-02-08 12:42) [45]


> Ega23 ©   (08.02.13 12:39) [44]


ну а почему бы не закрыть старую?


 
Rouse_ ©   (2013-02-08 12:49) [46]

Ну закроешь ты старую, а смысл?


 
vlad   (2013-02-08 12:54) [47]


> Rouse_ ©   (08.02.13 12:49) [46]
>
> Ну закроешь ты старую, а смысл?


Да в тот то и дело что не закрою.
A где грабли не пойму:
procedure TMyForm.FormCreate(Sender: TObject);
begin
//почему эта команда не закрывает старую копию?
SendMessage(FindWindow(nil, "MyProgram"), WM_CLOSE, 1, 0);
//а эта работает без проблем?
SendMessage(FindWindow(nil, "Диспетчер задач Windows"), WM_CLOSE, 1, 0);
end;


Ну нужно так и все.


> > brother ©   (07.02.13 18:17) [27]
> >
> > найми программиста...


Ребята дорогие, я специально написал в раздел "начинающим".


 
Ega23 ©   (2013-02-08 13:00) [48]


> ну а почему бы не закрыть старую?

Т.е. принципиальных причин нет, я правильно понял?
Почему плохо закрывать старую:
Во-первых, ты её найти не можешь... :)))    (шутка)
Во-вторых, вот она что-то там такое делает, шуршит вовсю, пердит-пыхтит, старается. И будет так ещё пердеть-пыхтеть, например, час. А тут её - фигак, и топором рубят. Не айс.


 
vlad   (2013-02-08 13:04) [49]


> Во-первых, ты её найти не можешь... :)))    (шутка)


Диспетчер задач значит находит, а свою копию найти не может.


> Во-вторых, вот она что-то там такое делает, шуршит вовсю,
>  пердит-пыхтит, старается. И будет так ещё пердеть-пыхтеть,
>  например, час. А тут её - фигак, и топором рубят. Не айс.
>


Да черт с ней.


 
Ega23 ©   (2013-02-08 13:23) [50]


> Диспетчер задач значит находит, а свою копию найти не может.

Тебя предупреждали. А ты не слушаешь.
Ненаказуемо, но "будет путь его тернистый долог".


 
Anatoly Podgoretsky ©   (2013-02-08 14:45) [51]


> упс, промахнулся топиком)

Стреляй из лука


 
брат Птибурдукова   (2013-02-08 14:54) [52]


> фигак, и топором рубят
WM_CLOSE — таки мелковато для топора :-)


 
Плохиш ©   (2013-02-09 23:31) [53]


> vlad   (08.02.13 13:04) [49]

Закрыть старую копию ничем не отличается от передать в неё чего-то. Решений в мировой помойке сколько угодно, даже для копи/паста, даже на этом форуме можно найти несколько тем. Но учитывая, что обсуждение перевалило за полсотни, программиста нанять будет безопасней и дешевле.



Страницы: 1 2 вся ветка

Текущий архив: 2013.11.10;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.012 c
6-1270034814
jetbird
2010-03-31 15:26
2013.11.10
Кодировка вложений


2-1360264863
alumium
2013-02-07 23:21
2013.11.10
Надежное удаление с последующим форматированием


6-1269002967
Domkrat
2010-03-19 15:49
2013.11.10
Login на Google


15-1369034958
>|<
2013-05-20 11:29
2013.11.10
Защита приложения


15-1369549466
TUser
2013-05-26 10:24
2013.11.10
Аттракцион природы и разума