Как я могу разблокировать или удалить файл, который используется, чтобы я мог удалить его? Рассматриваемый файл используется моим собственным приложением.
В частности, мое приложение использует бесплатную Zeos Lib. При открытии и сохранении моей базы данных файл sqlite3.dll должен находиться в том же каталоге, что и мое приложение, чтобы работать правильно.
Я хочу, чтобы мое приложение было на 100% автономным, поэтому я добавил sqlite3.dll как RC_DATA в свой проект, и всякий раз, когда мне нужно его использовать (например, открывать или сохранять базу данных), я извлекаю его в ту же папку, что и мое приложение. . После завершения операции открытия или сохранения я хотел бы удалить файл sqlite3.dll, и никто даже не узнал бы, что он был там, или не пришлось бы беспокоиться о недостающих библиотеках и т. Д. (Хотя я могу понять, что некоторым из вас может не понравиться идея хранения библиотек внутри приложения, у меня есть свои причины для этого: я не хочу, чтобы мои конечные пользователи знали, что стоит за функционированием моего приложения (SQL), и им также не нужно беспокоиться о отсутствуют библиотеки динамической компоновки.)
Проблема в том, что я могу успешно извлечь sqlite3.dll и использовать его для своих операций, но файл блокируется моим приложением (пока я не закрою свое приложение), что приводит меня к следующему:
Принудительно разблокировать файл sqlite3.dll, не закрывая приложение
Принудительно удалить файл sqlite3.dll
Если, конечно, нет другого предложения?
Вот пример его извлечения и использования. С моей стороны не нужно делать никаких прямых вызовов, таких как LoadLibrary и т.д.; модули Zeos Lib должны позаботиться об этом, пока sqlite3.dll находится в том же каталоге, что и приложение.
procedure ExtractResource(ResName: String; Filename: String);
var
ResStream: TResourceStream;
begin
ResStream:= TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
ResStream.Position:= 0;
ResStream.SaveToFile(Filename);
finally
ResStream.Free;
end;
end;
//Open procedure
var
sFileName: String = ExtractFilePath(ParamStr(0)) + 'Sqlite3.dll';
if OpenDialog1.Execute then
begin
ExtractResource('RES_SQLITE3', sFileName);
... //process my database
...
... // finished opening database
if FileExists(sFileName) then
DeleteFile(sFileName);
end;
ИЗМЕНИТЬ
Я думаю, что то, что я пытаюсь сделать, не очень практично, это не очень хорошая идея, как ранее комментировал STATUS_ACCESS_DENIED. Я решил, что лучше не продолжать то, что я намеревался сделать.
LoadLibrary
для загрузки dll, не забудьте вызватьFreeLibrary
перед удалением. - person RRUZ   schedule 16.05.2011