Как я могу разблокировать или удалить используемый файл, чтобы я мог его удалить?Данный файл используется моим собственным приложением.
В частности, мое приложение использует бесплатную версию 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.Я решил, что лучше не продолжать то, что я намеревался сделать.