Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно проверить занят ли аудио файл другим процессом? [D7, WinXP]


Dr. Andrew ©   (2005-06-24 05:07:00) 

Мастера! Подскажите - как можно проверить в процедуре сохранения аудио файла - используется ли он другим процессом в настоящее время или нет (при сохранении его с тем же именем, что и при открытии)? И как можно закрыть этот процесс, чтобы корректно перезаписать аудио файл? Спасибо всем за практический пример.


XProger   (2005-06-24 18:38:00) [1]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1119347185&n=5


Dr. Andrew   (2005-06-24 14:04:00) [2]

Осуществить перезапись занятого процессом файла, можно только посредством убийства занимающего процесса.

А как это, например, можно сделать?
Для этого можно использовать, например Hook?
Пожалуйста, приведите пример типичного кода, например с Hook.
Спасибо за помощь!


XProger   (2005-06-24 13:26:00) [3]

*if not Result then


XProger   (2005-06-24 13:25:00) [4]

Моя ошибка, файл не закрывал...

function ActiveFile(FileName: string): boolean;
var
F : File of Byte;
begin
FileMode := 2;
AssignFile(F, FileName);
{$I-}
Reset(F);
{$I+}
Result := IOResult <> 0;
if Result then
CloseFile(F);
end;

Осуществить перезапись занятого процессом файла, можно только посредством убийства занимающего процесса.


Dr. Andrew   (2005-06-24 11:28:00) [5]

Код не работает!

function ActiveFile (FileName : string): Boolean;
    var F : File of Byte;
begin
 Result := False;
 FileMode := 2;
 AssignFile(F, FileName);
{$I-}
 Reset(F);
{$I+}
 if IOResult <> 0 then Result := True;
end;

В процедуре сохранения аудио файла я прописал следующий код:

if ActiveFile(SaveDialog1.FileName) then Exit;
FileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);

Функция ActiveFile всегда равна False!

После открытия файла, а затем его сохранения под тем же именем Windows выдает ошибку:

---------------------------
Debugger Exception Notification
---------------------------
Project soundeditor.exe raised exception class EFCreateError with message 'Cannot create file "E:\My Test\sounds\mysoundwav.wav". The process cannot access the file because it is being used by another process'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------

Какой есть выход? В чем моя ошибка?


Dr. Andrew   (2005-06-24 11:11:00) [6]

Большое спасибо за практический ответ!
Этим мы можем узнать - занят ли данный файл другим процессом.
А каким образом можно все же его перезаписать под тем же именем, независимо от того, что он используется другим процессом, после открытия его в процедуре, например OpenAudioFile, с помощью OpenDialog? Например, как это реализовано в Cool Edit Pro 2.0? Там, после открытия файла без его переименования, можно постоянно его перезаписывать под тем же именем.


XProger   (2005-06-24 05:56:00) [7]


var
F : File of Byte;
begin
FileMode := 2;
AssignFile(F, SaveDialog1.FileName);
{$I-}
Reset(F);
{$I+}
if IOResult <> 0 then Занят;
end;


Dr. Andrew   (2005-06-24 05:24:00) [8]

Небольшое уточнение вопроса!
При вызове в процедуре сохранения аудио файла следующего кода - FileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate), где FileStream : TFileStream, и сохранении его без изменения имени, Windows выдает ошибку, что данный файл уже используется другим процессом и не может его открыть или создать. Как можно либо до вызова этого кода проверить - занят ли аудио файл другим процессом или корректно его все же открыть? Пожалуйста, маленький практический пример. Всем спасибо!


Наверх

Титульная страница Поиск, карта сайта Написать письмо